<?php
/*
 class myXajaxResponse extends xajaxResponse
 {
 function addCreateOption($sSelectId, $sOptionText, $sOptionValue)
 {
 $this->addScript("addOption('".$sSelectId."', '".$sOptionText."', '".$sOptionValue."');");
 }
 }
 */

/*
 * alert : xajax
 * pour debug
 * appel depuis une fonction xajax ou javascript
 */
function alert($string,$elementId = 'alert'){
	$objResponse = new xajaxResponse();
	/*décommenter pour afficher la fenetre de debug	 */
	if(trim($string != '')){
		$objResponse->assign($elementId, 'style.display', '');
		$objResponse->assign($elementId, 'innerHTML', $string);

	}
	else
	$objResponse->assign($elementId , 'style.display', 'none');
	return $objResponse;
}


/*
 * modifyFile : xajax
 * permet de modifier un fichier créé via le menu
 *
 */
function modifyFile($value,$action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$p_administrateur = recuperer_variable("administrateur", "");
	global $racine_admin;
	$alert = "";
	$error = "";
	$verif = "";
	$script = '';


	$objResponse->assign('gestion_menu', 'style.display', 'none');
	$objResponse->assign('form_modify_file', 'style.display', '');

	$objResponse->assign('modify_file_area', 'style.width', '100%');
	$objResponse->assign('modify_file_area', 'style.height', '400px');

	switch($action) {

		case "modifier":
			$file =sprintf("%s%s",$racine_admin,$value);
			if(!is_file($file)){
				$objResponse->assign('error_modify_file', 'value', "$file n'est pas un fichier");
			}else{
				$lines = file($file);
				$template = implode("", $lines);
				//$template =sprintf("%s%s \n %s",$racine_admin,$value,$template);//debug
				//$objResponse->assign('file_name_modify','innerHTML',$value);
				$objResponse->assign('modify_file_area', 'value', $template);
				//$objResponse->assign('modify_file_area', 'value', strip_tags(highlight_string($template)));
			}
			break;
		case "valider":
			foreach($value as $key => $val){
				$alert .= "$key => $val<br />";
			}

			$file = sprintf("%s%s",$racine_admin,$_SESSION['modif_form_item_id']['url_menu']);
			$ecrire = $value['modify_file_area'];

			$file_ecrire=@fopen($file,"wb");
			if($file_ecrire){

				fwrite($file_ecrire,$ecrire);
				fclose($file_ecrire);

				$objResponse->assign('form_modify_file', 'style.display', 'none');
				$objResponse->assign('form_new_menu', 'style.display', 'none');
				$objResponse->assign('gestion_menu', 'style.display', '');
				$objResponse->assign('error_menu','innerHTML', "Votre fichier $file a été modifié avec succes");
			}else $objResponse->assign('error_modify_file', 'innerHTML', "Impossible d'ecrire dans le fichier $file");




			break;
		case "annuler":
			$objResponse->assign('form_modify_file', 'style.display', 'none');
			$objResponse->assign('gestion_menu', 'style.display', '');
			break;
		default:
			break;
	}

	if($script != "") $objResponse->script($script);
	return $objResponse;
}


/*
 * listMenuAutorisation
 * creation de la liste des autorisation disponibles pour l'administration
 *
 */
function listMenuAutorisation($id_priorite_sent =''){
	$admin = recuperer_variable("administrateur", "");
	$id_priorite =  $admin->id_priorite;
	
	$options = "";
	$connexion = sql_connecter();
	$requete = "SELECT * ";
	$requete .= "FROM `admin_priorite`";
	$requete .= sprintf(" where `id_priorite` >= %d", $id_priorite);
	
	$resultat = sql_executer($connexion, $requete);
	$nb_line = sql_nombre_lignes($resultat);
	if ($nb_line>0){
		while ($ligne = sql_lire_ligne_objet($resultat)){
			$options .= sprintf("<option value = \"%d\" %s > %s</option>\n",$ligne->id_priorite, isset($id_priorite_sent) && $id_priorite_sent==$ligne->id_priorite ?"selected = \"selected\"":"", $ligne->libelle);
		}
	}
	return $options;
}

/**
 * 
 * @param string  $listMenuLI
 */
function affichage_hors_menu($listMenuLI){
			$pattern_niv0 = "/<li>Niv0(.*?)<\/li>/";
			
			if(preg_match($pattern_niv0,$listMenuLI)){
				
				$replacement = "<li>$1</li>";
				$b = preg_match_all($pattern_niv0,$listMenuLI, $matches);
				
				if($b == 1)//un seul hors menu
					$listMenuLI = preg_replace($pattern_niv0,"</ul><b>Page hors menu</b><ul>$replacement</ul><b>Pages menu</b><ul>",$listMenuLI,1);
				else{
				$listMenuLI = preg_replace($pattern_niv0,"</ul><b>Pages hors menu</b><ul>$0",$listMenuLI,1);
				$listMenuLI = preg_replace($pattern_niv0,$replacement,$listMenuLI,$b-1);
				$listMenuLI = preg_replace($pattern_niv0,$replacement."</ul><b>Pages menu</b><ul>",$listMenuLI);
				}
			}
			
		return $listMenuLI;
}
/*
 * gestionMenu : xajax
 * formulaire correspondant a la création/modification de menu
 * appel de la fonction xajax correspondant a l'action souhaitée
 *
 */
function gestionMenu($value,$action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$p_administrateur = recuperer_variable("administrateur", "");
	$alert = "";
	$out = '';
	$formMenu = '';
	$legend = '';
	$script = '';
	$openFolder = "";
	global $open_folder;
	$openFolderPath = explode("/",$open_folder);//"added"; //dossier dans lequel seront ajoutés les fichiers créés automatiquement
	if(count($openFolderPath) == 0)$openFolder = explode('\\',$open_folder);
	if(count($openFolderPath) == 0)die('error parsing open_folder path');
	while($openFolder == ""){
		$openFolder = array_pop($openFolderPath);
		$openFolder = trim($openFolder);
	}
	
	global $racine_admin;

	switch ($action){
		case "ajouter":
			$legend = 'Ajouter une entrée';
			$objResponse->assign('form_modify_file', 'style.display', 'none');
			
			$formMenu.= sprintf("<input type=\"image\" value=\"reset\" onclick=\"xajax_gestionMenu('','ajouter');return false;\" class=\"img_normal\" src=\"%sretour.png\" alt=\"reset\" />\n",$_SESSION['dossier_image']);
			$formMenu.= sprintf("<input type=\"image\" value=\"Soumettre\" onclick=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'submit');return false;\" class=\"tooltip img_normal\" alt=\"Soumettre\" title=\"Soumettre\" src=\"%svalider.png\" />\n",$_SESSION['dossier_image']);
			if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
			
			break;
		case "modifier":
			$legend = 'Modifier une entrée';
			$objResponse->assign('form_modify_file', 'style.display', 'none');

			$requete  = " select * ";
			$requete .= " from admin_menu m";
			$requete .= " where id_priorite >= ".$p_administrateur->id_priorite." ";
			//$requete .= " and etat != 0 ";
			$requete .= " order by m.niveau_menu, m.rang";
			$resultat = sql_executer($connexion, $requete);
			$menu = array();
			while ($ligne = sql_lire_ligne_objet($resultat)){
				$menu[] = $ligne;
			}

			$out .= "<h3>Cliquer sur l'entrée à modifier</h3>";
			$onclick ="onclick=\"xajax_gestionMenu('%d','modifier')\"";
			$out .= affichage_hors_menu(listMenuLI(0, 0, $menu,$onclick));

			if(is_string($value) && preg_match("/^\d+$/",$value)){
				$obj = recursiveArraySearch($menu, $value, 'id_menu');//on cherche l'indice correspondant a l'id_menu dans le tableau

				//on stocke en session les variables utilisées pour l'affichage
				$_SESSION['modif_form_item_id']['first']			= '1';// gestion du cas : niveau1
				$_SESSION['modif_form_item_id']['id_menu']			= $id_menu 			= $menu[$obj]->id_menu;
				$_SESSION['modif_form_item_id']['libelle_menu']		= $libelle			= $menu[$obj]->libelle;
				$_SESSION['modif_form_item_id']['titre_page']		= $titre_page		= $menu[$obj]->titre_page;
				$_SESSION['modif_form_item_id']['url_menu']			= $url_menu			= $menu[$obj]->url;
				$_SESSION['modif_form_item_id']['niveau_menu']		= $niveau_menu		= $menu[$obj]->niveau_menu;
				$_SESSION['modif_form_item_id']['id_menu_parent']	= $id_menu_parent	= $menu[$obj]->id_menu_parent;
				$_SESSION['modif_form_item_id']['rang_menu']		= $rang				= $menu[$obj]->rang;
				$_SESSION['modif_form_item_id']['actif_menu']		= $etat 			= $menu[$obj]->etat;
				$_SESSION['modif_form_item_id']['autorisation_menu']= $id_priorite		= $menu[$obj]->id_priorite;

				if(preg_match("/$openFolder/",$url_menu)){//TODO : verifier qu'aucune autre entrée ne pointe sur ce fichier
					$warningPlus = "Attention, ceci effacera le fichier lié";
				}

				$formMenu .= sprintf("<input type=\"image\" value=\"Annuler\" alt=\"Annuler\" title=\"Annuler\" onclick=\"xajax_gestionMenu('','modifier');return false;\" class=\"img_normal\" src=\"%sretour.png\" />\n",$_SESSION['dossier_image']);
				$formMenu .= sprintf("<input type=\"hidden\" id=\"id_menu\" name=\"id_menu\" value=\"%d\" />\n",$id_menu);
				$formMenu .= sprintf("<input type=\"image\" value=\"Modifier\" class=\"tooltip img_normal\" alt=\"Modifier\" title=\"Modifier\" onclick=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'submit');return false;\"  src=\"%svalider.png\" alt=\"Modifier\" />\n",$_SESSION['dossier_image']);
				$formMenu .= sprintf("<input type=\"image\" value=\"Supprimer\"  id = \"supprimer\"  class=\"tooltip img_normal\" alt=\"Supprimer\" title=\"Supprimer\" onclick = \"if(window.confirm('Confirmer la suppression de l\'item \'%s\' ? %s')== true){xajax_gestionFormMenu(xajax.getFormValues(this.form),'supprimer');return false;}\" src=\"%ssupprimer.png\" />\n",addslashes(str_replace(array("'","\""),"",$libelle)),isset($warningPlus)?$warningPlus:"", $_SESSION['dossier_image']);

				$pattern = sprintf("/^\/%s/",$openFolder);
				if(preg_match($pattern,$url_menu))	$formMenu .= sprintf("</tr><tr><td colspan =\"3\"><input type = \"button\" id = \"modifyFile\" value = \"Modifier le contenu du fichier\"   onclick = \"xajax_modifyFile('%s','modifier');return false;\"/></td>",$url_menu);
				else $objResponse->assign('modifyFile_area', 'style.display', 'none');
			}//end if
			else $formMenu ='';
			break;
	}// end switch

	if($formMenu != ''){
		//le formulaire en lui même
		$form =  "<form method =\"post\" id=\"form_new_menu\"  enctype=\"multipart/form-data\" action=\"javascript:\">\n";

		if(isset($_SESSION['modif_form_item_id']['id_menu'])){
			$form .= "  <p class=\"form\">\n";
			$form .= "  <label for=\"show_id_menu\" class=\"text\">";
			$form .= "ID : ";
			$form .= "  </label>\n";
			$form .= sprintf("<span class=\"text\">%d</span>",$_SESSION['modif_form_item_id']['id_menu']);
			$form .= "	</p>\n";
		}

		$form .= "  <p class=\"form\">\n";
		$form .= "  <label for=\"libelle_menu\" class=\"text\">";
		$form .= "  Libelle :";
		$form .= "  </label>\n";
		$form .= sprintf("<input type=\"text\" class=\"text\" id=\"libelle_menu\" name =\"libelle_menu\" value=\"%s\" /><br/>\n",isset($libelle)?$libelle:'');
		$form .= "	</p>";

		$form .= "  <p class=\"form\">\n";
		$form .= "  <label for=\"titre_page\" class=\"text\">";
		$form .= "  Titre page :";
		$form .= "  </label>\n";
		$form .= sprintf("<input type=\"text\" class=\"text\" id=\"titre_page\" name =\"titre_page\" value=\"%s\" /><br/>\n",isset($titre_page)?$titre_page:'');
		$form .= "	</p>";

		$form .= "  <p class=\"form\">\n";
		$form .= " <label for=\"url_menu\"  class=\"text\">";
		$form .= " URL : ";
		$form .= "  </label>\n";
		$form .= sprintf("<input type=\"text\" class=\"text\" id=\"url_menu\" name =\"url_menu\" value=\"%s\" onblur=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_url');return false;\" />\n",isset($url_menu)?$url_menu:'');
		$form .= "	<input type=\"hidden\" id=\"error_url_menu\" name=\"error_url_menu\" value =\"\" />";
		$form .= "  <label class=\"text\" id=\"create_menu_file_label\" name=\"create_menu_file_label\" style=\"display:none\">&nbsp;</label>\n";
		$form .= "  <input class=\"text\" type=\"button\" id=\"create_menu_file\" name=\"create_menu_file\" onclick=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_ajout_fichier');return false;\" value=\"Cr&eacute;er ce fichier?\" style=\"display:none\" />\n";
		$form .= sprintf("  <input type=\"hidden\" id=\"same_url_menu\" name=\"same_url_menu\"  value=\"%s\"  />\n",isset($same_url_menu)?$same_url_menu:'');
		$form .= "	</p>";

		$form .= "  <p class=\"form\">\n";
		$form .= "<table>";
		$form .= " <tr>\n";
		$form .= "  <th>";
		$form .= "  Niveau :";
		$form .= "  </th>\n";
		$form .= "  <th>";
		$form .= "  Parent :";
		$form .= "  </th>\n";
		$form .= "  <th>";
		$form .= "  Rang :";
		$form .= "  </th>\n";
		$form .= " </tr>\n<tr>\n";
		$form .= "  <td id=\"p_select_menu_niveau\">";

		$form .= "    <select size=\"4\" name=\"select_menu_niveau\" id=\"select_menu_niveau\" onclick=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_parent');return false;\" onchange=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_parent');return false;\">\n";
		$form .= sprintf("   <option value=\"0\" %s >hors menu</option>\n",isset($niveau_menu) && $niveau_menu == '0' ? "selected=\"selected\"":'');
		$form .= sprintf("   <option value=\"1\" %s >niveau1</option>\n",isset($niveau_menu) && $niveau_menu == '1' ? "selected=\"selected\"":'');
		$form .= sprintf("   <option value=\"2\" %s >niveau2</option>\n",isset($niveau_menu) && $niveau_menu == '2' ? "selected=\"selected\"":'');
		$form .= sprintf("   <option value=\"3\" %s >niveau3</option>\n",isset($niveau_menu) && $niveau_menu == '3' ? "selected=\"selected\"":'');
		$form .= sprintf("   <option value=\"4\" %s >niveau4</option>\n",isset($niveau_menu) && $niveau_menu == '4' ? "selected=\"selected\"":'');
		$form .= "    </select>\n";

		$form .= "  </td>\n";
		$form .= "  <td id=\"p_select_menu_parent\">";

		if(isset($niveau_menu)){//c'est que l'on modifie une entrée
			$parent = array("select_menu_niveau" => $niveau_menu,"select_menu_niveau_selected" => $id_menu_parent,"modif_form_rang" => $id_menu);
			$objResponse->call('xajax_gestionFormMenu',$parent,'menu_parent');
			
			$rang = array("select_menu_parent" => $niveau_menu == 0? "-1" : $id_menu_parent,"select_menu_rang" => $rang,"modif_form_rang" => $id_menu);
			$objResponse->call('xajax_gestionFormMenu',$rang,'menu_rang');

		}

		$form .= "  </td>\n";
		$form .= "  <td id=\"p_select_menu_rang\" >";

		$form .= "  </td>\n";
		$form .= " </tr>";
		$form .= "  </table>";
		$form .= "	</p>";

		$form .= "  <p class=\"form\">\n";
		$form .= " <label for=\"select_menu_autorisation\" class=\"text\">";
		$form .= " Autorisation : ";
		$form .= "  </label>\n";
		$form .= " <select id=\"select_menu_autorisation\" name=\"select_menu_autorisation\">\n";
		$form.= 	listMenuAutorisation(isset($id_priorite)?$id_priorite:'');
		$form.= "  </select>\n";
		$form .= "	</p>";

		$form .= "  <p class=\"form\">\n";
		$form .= " <label for=\"actif_menu\" class=\"text\">";
		$form .= " Actif : ";
		$form .= "  </label>\n";
		$form .= sprintf(" <input type=\"radio\" name=\"actif_menu\" value=\"1\" %s />Oui<input type=\"radio\" name=\"actif_menu\" value=\"0\" %s />Non\n",((isset($etat) && $etat == 1)|| !isset($etat))?"checked=\"checked\"":'',isset($etat) && $etat == 0 ?"checked=\"checked\")":'');
		$form .= "	</p>";

		$formMenu =  $form."<p class=\"envoy form\">".$formMenu ."</p>";
		$formMenu .= "</form>\n";
	}

	if($alert!= "")$script .= "xajax_alert('$alert','alert');";//debug
	if($script != "") $objResponse->script($script);
	if(!isset($verif))$verif = '';
	$objResponse->assign('error_menu', 'innerHTML', $verif);
	$objResponse->assign('legend_gestion_menu', 'innerHTML', $legend);
	$objResponse->assign('menu_actif', 'innerHTML', $out);
	$objResponse->assign('modif_menu_actif', 'innerHTML', $formMenu);
	return $objResponse;
}


/*
 * gestionFormMenu : xajax
 *
 * verifier la conformité du formulaire avant soumission
 *
 */
function gestionFormMenu($value,$action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$p_administrateur = recuperer_variable("administrateur", "");
	global $host_espace_index;
	$alert = "";
	$error = "";
	$verif = "";
	$script = '';
	$openFolder = "";
	global $open_folder;
	$openfolder = "";
	$openFolderPath = explode("/",$open_folder);//dossier dans lequel seront ajoutés les fichiers créés automatiquement
	if(count($openFolderPath) == 0)$openFolder = explode('\\',$open_folder);
	
	while($openFolder == ""){
		$openFolder = array_pop($openFolderPath);
		$openFolder = trim($openFolder);
	}
	
	global $racine_admin;
	$refresh = false; //passer a true pour rafraichir le menu general

	switch ($action) {
		case "menu_parent" :
			//permet de construire la liste des parents disponibles pour le niveau selectionné

			//si on est au niveau 1, on affiche le menu de selection de rang
			if($value['select_menu_niveau'] == 1){
				if(!isset($_SESSION['modif_form_item_id']) || $_SESSION['modif_form_item_id']['first'] != '1')$script .= " xajax_gestionFormMenu('0','menu_rang');";//si on ne modifie pas une entr&eacute;e
				$options = "Aucun<input type=\"hidden\" size=\"1\" id=\"select_menu_parent\" name=\"select_menu_parent\" value = \"0\" />";
			}//entree hors menu
			elseif($value['select_menu_niveau'] == 0){
				if(!isset($_SESSION['modif_form_item_id']) || $_SESSION['modif_form_item_id']['first'] != '1')$script .= " xajax_gestionFormMenu('-1','menu_rang');";//si on ne modifie pas une entr&eacute;e
				$options = "Aucun<input type=\"hidden\" size=\"1\" id=\"select_menu_parent\" name=\"select_menu_parent\" value = \"0\" />";
			}
			//sinon, on affiche les parents du niveau selectionné
			else{
				$select_menu_niveau = $value['select_menu_niveau']-1;

				$requete = "SELECT `id_menu`, `libelle`,`rang` ";
				$requete .= "FROM `admin_menu` ";
				$requete .= "where `niveau_menu`= '$select_menu_niveau' ";
				$requete .= "ORDER BY `id_menu_parent`,`rang`";
				$resultat = sql_executer($connexion, $requete);
				$nb_line = sql_nombre_lignes($resultat);
				if ($nb_line>0){
					$options = "<select size=\"$nb_line\" id=\"select_menu_parent\" name=\"select_menu_parent\" onchange=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_rang');return false;\">\n";
					while ($ligne = sql_lire_ligne_objet($resultat)){
						if(isset($_SESSION['modif_form_item_id']) && $_SESSION['modif_form_item_id']['niveau_menu']== $value['select_menu_niveau']-1 && $ligne->id_menu ==  $_SESSION['modif_form_item_id']['id_menu']){
							//on ne veut pas afficher l'item en cours de modification comme etant son propre parent
						}
						else{
							$options .= sprintf("<option value = \"%d\" %s > %s</option>\n",$ligne->id_menu, isset($value['select_menu_niveau_selected']) && $value['select_menu_niveau_selected']==$ligne->id_menu?'selected="selected"':'', $ligne->libelle);
						}
					}
					$options .= "</select>\n";
				}
				else $options = "";
				if ($nb_line==1)$script .= sprintf(" xajax_gestionFormMenu(%d,'menu_rang');",$select_menu_niveau);//Si il n'y a qu'une possibilit&eacute;, on affiche le menu rang
			}
			//$alert .= "niveau_menu  $select_menu_niveau";//debug
			if(isset($_SESSION['modif_form_item_id']))$_SESSION['modif_form_item_id']['first']='0';//on passe a 0 ici car l'office est rempli
			$objResponse->assign('p_select_menu_parent', 'innerHTML', $options);
			$objResponse->assign('p_select_menu_rang', 'innerHTML', '');
			break;

		case "menu_rang":
			//permet de construire la liste des items au niveau n ayant le même parent
			//gere l'emplacement du nouvel item
			
			if(!is_array($value)){//si le niveau 1 est selectionné
				$val = $value;
				unset($value); //Cannot use a scalar value as an array
				$value['select_menu_parent'] = $val;
			}
			
			//on affiche les elements disponibles a ce niveau en fonction du parent et le rang de chacun
			$requete = "SELECT `id_menu`, `libelle`,`rang` ";
			$requete .= "FROM `admin_menu` ";
			$requete .= "where `id_menu_parent`= '".$value['select_menu_parent']."'";
			$requete .= $value['select_menu_parent'] == "-1" ? "and `niveau_menu` = '0'" : "and `niveau_menu` != '0'";
			$requete .= "ORDER BY `rang`";

			$resultat = sql_executer($connexion, $requete);
			$nb_line = sql_nombre_lignes($resultat);

			$i = 1;
			$libelle = isset($_SESSION['modif_form_item_id'])?$_SESSION['modif_form_item_id']['libelle_menu']:'';//si on est en phase modif, besoin de recuperer le libelle de l'item courant avant de constuire la liste deroulante :

			if ($nb_line){

				if(!isset($_SESSION['modif_form_item_id']) || $value['select_menu_parent'] != $_SESSION['modif_form_item_id']['id_menu_parent']){
					$nb_line++;
				}

				$options = "<select id=\"select_menu_rang\" size=\"$nb_line\" name=\"select_menu_rang\"  onchange=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_rang');return false;\" onclick=\"xajax_gestionFormMenu(xajax.getFormValues(this.form),'menu_rang');return false;\">\n";

				while ($ligne = sql_lire_ligne_objet($resultat)){
					if(isset($value['select_menu_rang']) && $i == $value['select_menu_rang']){
						$options .=  sprintf("<option value = \"%d\" selected=\"selected\">%d. %s </option>\n",$i,$i,$libelle);
						$i++;
					}
					if($libelle != $ligne->libelle){
						$options .= sprintf("<option value = \"%d\" >%d. %s </option>\n",$i,$i,$ligne->libelle);
						$i++;
					}
				}
				if($i <= $nb_line){
					$options .= sprintf("<option value = \"%d\" selected=\"selected\">%d. %s </option>\n",$i,$i,$libelle);
				}
				$options .= "</select>";
			}
			else {
				$options = "<select id=\"select_menu_rang\" size=\"2\" name=\"select_menu_rang\" >\n";
				$options .= sprintf("<option value = \"%d\" selected=\"selected\">%d. %s </option>\n",$i,$i,$libelle);
				$options .= "</select>";
			}

			$objResponse->assign('p_select_menu_rang', 'innerHTML', $options);
			break;

		case "menu_url" :
			/*
			 * verifier que l'url passée existe,
			 * si oui, verifier qu'elle n'est pas deja affectée a une entrée
			 * 		si oui, demande de confirmation nouvelle entrée pour cette url
			 * si non, proposer de créer le fichier a l'emplacement suivant : $_session['racine']/$openFolder/fichier.php
			 * Permet l'ajout de variables $_GET
			 */
			$color_url_menu = '#FFFFFF';
			$visibility_create_menu_file = 'none';
			if($value['url_menu'] != ""){
				$pattren_url = "/^(.*?)(\.php)?([\?|#].*)?$/";
				preg_match($pattren_url,$value['url_menu'],$match_url);//on separe le nom du fichier des variables get
					
				$menu_url = $match_url[1];
				$menu_url .= isset($match_url[2])?$match_url[2]:"";
				$menu_get = "";
				if(isset($match_url[3])){
					$menu_get = filter_var($match_url[3], FILTER_SANITIZE_URL);
					//This filter allows all letters, digits and $-_.+!*'(),{}|\\^~[]`"><#%;/?:@&=$match_url[3]
				}
				$menu_url = preg_replace("/^[\.?\/?\.?]*/","",$menu_url);// on élimine le point et/ou le slash initial
				$menu_url = preg_replace("/[\.?\/?\.?]*$/","",$menu_url);// on élimine le slash et/ou le point final 
				$menu_url = preg_replace("/\/+/","/",$menu_url);//on elimine les slashe multiples
				$pattern_filename = "/^[a-zA-Z0-9\._\-\/]+$/";
				if(!preg_match($pattern_filename,$menu_url)){
					$error = sprintf("Nom de fichier  %s incorrect \n Seuls les caractères alphanumeriques et - _ . sont autorisés pour le nom du fichier.", $menu_url);
					$objResponse ->alert($error);
					$color_url_menu = '#FF6600';
				}
				elseif($menu_get != "" && $menu_get !== $match_url[3]){
					$error = sprintf("variables d'url requete ou ancre incorrectes \n Seuls les caractères alphanumeriques et $-_.+!*'(),{}|\\^~[]`\"><#%;/?:@& sont autorisés.", $menu_get);
					$objResponse ->alert($error);
					$color_url_menu = '#FF6600';
				}
				else {
					$objResponse->assign('same_url_menu', 'value', '');	//on assigne 'same_url_value pour parer une premiere confirmation suivit d'une modification

					//on teste si c'est un dossier qui contient  index.php
					if(is_file($racine_admin."/".$menu_url."/index.php")){
						$ok = "ok";
						$menu_url = $racine_admin."/".$menu_url."/index.php";
						$color_url_menu = '#FFFFFF';
					}
					else{
						//sinon on test differentes possibilités de chemin pour l'existence du fichier 
						$file_possibilities = array($racine_admin.$menu_url,
						$racine_admin.$menu_url.".php",
						$racine_admin."/".$menu_url,
						$racine_admin."/".$menu_url.".php",
						$racine_admin."/$openFolder".$menu_url,
						$racine_admin."/$openFolder".$menu_url.".php",
						$racine_admin."/$openFolder/".$menu_url,
						$racine_admin."/$openFolder/".$menu_url.".php");
						foreach($file_possibilities as $url_test){
							if(is_file($url_test)){
								$ok = "ok";
								$menu_url = $url_test;
								$menu_url .= isset($match_url[3])?$match_url[3]:"";
								break;
							}
						}
					}
					if(isset($ok)){
						$menu_url = preg_replace("/^".quotemeta($racine_admin)."/","",$menu_url);// on retire la racine
						$requete = sprintf("SELECT `url` ");
						$requete .= sprintf("FROM `admin_menu` ");
						$requete .= sprintf("where  url = '%s'",$menu_url);
						$resultat = sql_executer($connexion, $requete);
						if (sql_nombre_lignes($resultat) != 0 && $menu_url != $value['same_url_menu']){
							$warning = "le fichier ".$menu_url." est deja une entrée de menu\nConfirmez vous votre saisie?";
							$intanswer = 1 ; //number of lines to skip if confirm = false
							$objResponse -> confirmCommands($intanswer,$warning);
							$objResponse->assign('same_url_menu', 'value', $menu_url);
						}
					}
					elseif(!isset($ok)){//on a pas trouvé le dit fichier
						//$menu_url_nok = str_replace("/","",$menu_url).(!isset($match_url[2])?".php":"");
						if($menu_url != $value['same_url_menu'])$objResponse ->alert("Ce fichier $menu_url".(!isset($match_url[2]) || $match_url[2] == ""?".php":"")." n'existe pas, vous pouvez le créer");//on n'alerte pas a chaque fois
						$color_url_menu = '#FF6600';
						$visibility_create_menu_file = '';
						$num_folder = 0;
						while($ok == false){
							$tempo_url = str_replace("/","",$match_url[1]).($num_folder > 0?$num_folder:"").".php";
							if(!is_file($openFolder."/".$tempo_url))$ok = true;
							$num_folder++;
						}
						$menu_url = $tempo_url.$menu_get;
						$objResponse->assign('same_url_menu', 'value', $menu_url);
					}
				}
			}
			$objResponse->assign('url_menu', 'style.background', $color_url_menu);
			$objResponse->assign('create_menu_file','style.display',$visibility_create_menu_file);
			$objResponse->assign('create_menu_file_label','style.display',$visibility_create_menu_file);
			$objResponse->assign('url_menu', 'value', $menu_url);
			//$alert .= sprintf("%d => %s<br/>",6,$menu_url);//debug
			break;

		case "menu_ajout_fichier" :
			//Le fichier est automatiquement ajouté dans un dossier qui doit etre configuré pour autoriser apache a écrire.
			//il est basé sur un fichier 'template' $file
			if($value['url_menu'] != '' && $value['url_menu'] == $value['same_url_menu']) {

				$pattren_url = "/^(.*?)(\.php)([\?|#].*)?$/";
				preg_match($pattren_url,$value['url_menu'],$match_url);//on separe le nom du fichier des variables get
					
				$menu_url = $match_url[1].".php";
				$menu_get = "";
				if(isset($match_url[3])){
					$menu_get = filter_var($match_url[3], FILTER_SANITIZE_URL);
					//This filter allows all letters, digits and $-_.+!*'(),{}|\\^~[]`"><#%;/?:@&=$match_url[3]
				}

				$file = $racine_admin.'/_commun/example_contenu.tpl';
				$newfile = "/".$openFolder."/". $menu_url;


				if (!copy($file, $racine_admin.$newfile)) {
					$objResponse->alert(html_entity_decode('Erreur lors de la création du nouveau fichier : '). $newfile );
				}
				else{
					chmod($racine_admin.$newfile, 0664);
					$objResponse->assign('url_menu', 'style.background', '#FFFFFF');
					$objResponse->assign('url_menu', 'value', $newfile.$menu_get);
					$objResponse->assign('create_menu_file','style.display','none');
					$objResponse->assign('create_menu_file_label','style.display','none');
					$objResponse->alert('Ajout du nouveau fichier : '. $newfile.'');
				}
			}

			break;
		case "supprimer":
			//verification de l'existence d'enfants
			//si oui => suppression impossible
			//sinon => suppression de l'item

			if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
					
				$id_menu=$_SESSION['modif_form_item_id']['id_menu'];
					
				$requete  = " select * ";
				$requete .= " from admin_menu";
				$requete .= sprintf(" where id_menu_parent = '%d'",$id_menu);
				$resultat = sql_executer($connexion, $requete);
				if($resultat){
					if(sql_nombre_lignes($resultat) > 0){
						$verif = "Vous ne pouvez supprimer cet item car des sous-items en dépendent.";
						$objResponse->assign('error_menu', 'innerHTML', $verif);
					}
					else{
						$script .= "xajax_gestionMenu(this.value,'modifier');";
							
						//suppression du fichier si contenu dans le dossier 'ouvert'
						if(preg_match("/$openFolder/",$_SESSION['modif_form_item_id']['url_menu'])) unlink($racine_admin.$_SESSION['modif_form_item_id']['url_menu']);//TODO : verifier qu'aucune autre entrée ne pointe sur ce fichier
							
							
						conf_id_page($id_menu, "delete", $connexion);//on efface l'entrée dans le fichier conf.id_page.php	
						
						$requete = sprintf(" DELETE FROM `admin_menu` WHERE `admin_menu`.`id_menu` ='%d';",$id_menu);
						$resultat = sql_executer($connexion, $requete);
						
						
						if($resultat){
							//on gere le rang des elements deja presents
							$requete = sprintf("SELECT `id_menu`, `libelle`,`rang` ");
							$requete .= sprintf("FROM `admin_menu` ");
							$requete .= sprintf("where `id_menu_parent`= '%d'",$value['select_menu_parent']);
							$requete .= sprintf("ORDER BY `rang`");
							$resultat = sql_executer($connexion, $requete);
							$nb_line = sql_nombre_lignes($resultat);
							if ($nb_line){
								$rang = '1';
								while ($ligne = sql_lire_ligne_objet($resultat)){
									$requete = sprintf("UPDATE `admin_menu` SET `rang` = '%d' WHERE `admin_menu`.`id_menu` = '%d'",$rang,$ligne->id_menu);
									sql_executer($connexion, $requete);
									$rang++;
								}
							}
							//fin de gestion du rang
							$out = sprintf("Entrée %s effacée",$_SESSION['modif_form_item_id']['libelle']);
							unset($_SESSION['modif_form_item_id']);
							$refresh = true; //rafraichir le menu general
						}
						else{
							$alert .= "Error delete " .mysql_error();
						}
					}
				}
			}

			break;
		case "submit": //creation ou modification d'entrée
			//on verifie la validité des informations saisies
			$verif = "";
			$error = array();


			if($value['libelle_menu'] == ""){
				$error['libelle_menu'] = "le libelle est obligatoire<br />";
			}
				
			if($value['titre_page'] == ""){
				$error['titre_page'] = "le titre est obligatoire<br />";
			}

			//verification de l'url passée
			if($value['url_menu'] != ""){

				$pattren_url = "/^(.*?)(\.php)(\?.*)?$/";
				preg_match($pattren_url,$value['url_menu'],$match_url);//on separe le nom du fichier des possibles variables get
				$menu_url = $match_url[1];
				$menu_url .= isset($match_url[2])?$match_url[2]:"";

				$requete = "SELECT `url` ";
				$requete .= "FROM `admin_menu` ";
				$requete .= "where  url = '".$menu_url."'";
				$resultat = sql_executer($connexion, $requete);
				if(!file_exists("./".$menu_url)) {
					$error['url_menu'] = "le fichier ".$menu_url." n'existe pas <br />";
				}
			}
			else{
				$error['url_menu'] = "le champ 'URL' ne doit pas être vide.<br />";
			}

			if($value['select_menu_niveau']==''){
				$error['select_menu_niveau'] = "Vous devez spécifier le niveau pour inserer une entrée.";
			}
			//verification du parent
			if($value['select_menu_niveau']>1 && (!isset($value['select_menu_parent']) || $value['select_menu_parent'] == "" )){
				$error['select_menu_niveau'] = "Vous devez spécifier le parent pour inserer une entrée a ce niveau";
			}
			elseif($value['select_menu_niveau']== 1){
				$value['select_menu_parent'] = 0;
			}

			//on verifie le nb d'entrée par niveau
			if($value['select_menu_niveau'] == "1"){
				$requete = "SELECT `niveau_menu` ";
				$requete .= "FROM `admin_menu` ";
				$requete .= "where  niveau_menu ='1'";
				$resultat = sql_executer($connexion, $requete);
				if (sql_nombre_lignes($resultat) >= 6){
					if(!isset($_SESSION['modif_form_item_id']) || (isset($_SESSION['modif_form_item_id']) && $value['select_menu_niveau']!=$_SESSION['modif_form_item_id']['niveau_menu']))
					$error['select_menu_niveau'] = "Le nombre d'item maximum pour ce niveau est atteint (max = 6)";
				}
			}
			elseif($value['select_menu_niveau'] == "2"){
				$requete = "SELECT `id_menu` ";
				$requete .= "FROM `admin_menu` ";
				$requete .= "where  id_menu_parent = '".$value['select_menu_parent']."'";
				$resultat = sql_executer($connexion, $requete);
				if (sql_nombre_lignes($resultat) >= 8){
					if(!isset($_SESSION['modif_form_item_id']) || (isset($_SESSION['modif_form_item_id']) && $value['select_menu_niveau']!=$_SESSION['modif_form_item_id']['niveau_menu']))
					$error['select_menu_niveau'] = "Le nombre d'item maximum pour ce niveau est atteint (max = 8)";
				}

			}

			if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante

				//on verifie qu'il y a bien eu modification
				$modif ='';
				foreach($value as $key => $diff){
					if($modif != '')break;//il y a une modification => on sort
					switch ($key){
						case 'libelle_menu':
							if($_SESSION['modif_form_item_id']['libelle_menu'] != $diff)$modif=1;
							break;
						case 'titre_page':
							if($_SESSION['modif_form_item_id']['titre_page'] != $diff)$modif=1;
							break;
						case 'url_menu':
							if($_SESSION['modif_form_item_id']['url_menu'] != $diff)$modif=1;
							break;
						case 'select_menu_niveau':
							if($_SESSION['modif_form_item_id']['niveau_menu'] != $diff)$modif=1;
							break;
						case 'select_menu_parent':
							if($_SESSION['modif_form_item_id']['id_menu_parent'] != $diff)$modif=1;
							break;
						case 'select_menu_rang':
							if($_SESSION['modif_form_item_id']['rang_menu'] != $diff)$modif=1;
							break;
						case 'actif_menu':
							if($_SESSION['modif_form_item_id']['actif_menu'] != $diff)$modif=1;
							break;
						case 'select_menu_autorisation':
							if($_SESSION['modif_form_item_id']['autorisation_menu'] != $diff)$modif=1;
							break;
						default:
							break;

					}
				}
				if($modif == ""){
					$verif = "<p>Aucune modification n'a été effectuée</p>";
					//rien n'est modifié
				}

				$modifNiveau = $value['select_menu_niveau']-$_SESSION['modif_form_item_id']['niveau_menu'];// on verifie si on a modifié le niveau de menu

				if($modifNiveau != 0){
					$requete  = " select * ";
					$requete .= " from admin_menu m";
					$requete .= " where id_priorite >= ".$p_administrateur->id_priorite." ";
					$requete .= " order by m.rang";
					$resultat = sql_executer($connexion, $requete);
					$menu = array();
					while ($ligne = sql_lire_ligne_objet($resultat)){
						$menu[] = $ligne;
					}

					//on trie les entrées en arbo
					$tree = Array();
					foreach ($menu as $item) {
						$id = $item->id_menu;
						if (!isset($tree[$id])) {	//Il a pu être déjà créé par un de ses enfants, sinon on le crée ici 
							$tree[$id] = Array();
						}
						$tree[$id]['id_menu'] = $id;
						$tree[$id]['niveau_menu'] = $item->niveau_menu;
						$parent = $item->id_menu_parent;
						if (!isset($tree[$parent])) {	//Il a pu être déjà créé pour lui-même, ou par un autre de ses enfants, sinon on le crée ici 
							$tree[$parent] = Array();
						}
						$tree[$parent][$id] =& $tree[$id];

					}
					//Trouver le menu qui nous interresse
					$currentTree = $tree[$value['id_menu']];

					$nbchild = DeepestArray($currentTree);// on calcule la profondeur max sous l'item courant soit le nombre max d'enfants					
					$nbchild = $nbchild-1;
					// verification du nb max d'enfants pour ce niveau
					$enfantmax = array(0,3,2,1,0);//indice x = enfants max => $enfantmax[niveau1]=3 enfants max
					
					if ($nbchild>$enfantmax[$value['select_menu_niveau']]){
						$error['select_menu_niveau'] = sprintf("Vous ne pouvez descendre cet item de niveau. Le nombre d'enfants autorisés pour le niveau %d est de : %d, l'item que vous voulez déplacer a %d sous item%s.",$value['select_menu_niveau'] == 0 ? "'hors menu'" : $value['select_menu_niveau'],$enfantmax[$value['select_menu_niveau']],$nbchild,$nbchild >1?"s":""); 
					}
				}
			}// end verification

			//on met en couleur le background des zones a problème et on affiche le texte d'erreur
			foreach ($value as $key => $val){
				if(isset($error[$key])){
					$verif .= "<p>".$error[$key]."</p>";
					$objResponse->assign($key, 'style.background', '#FF6600');
				}
				else $objResponse->assign($key, 'style.background', '#FFFFFF');
			}

			//si tout est ok
			if($verif == ""){
				$out= '';

				//on gere le rang en premier*************************

				//on réorganise les rang de l'ancien niveau si déplacement
				$requete = sprintf("select `niveau_menu`, `rang` FROM `admin_menu` where  `id_menu` = %d and niveau_menu != 0", $value['id_menu']);
				$resultat = sql_executer($connexion, $requete);
				if(sql_nombre_lignes($resultat) != 0){
					$ligne = sql_lire_ligne_objet($resultat);
					$requete = sprintf("update `admin_menu` set  `rang`= `rang`-1 where `niveau_menu` = %d and `rang`> %d", $ligne->niveau_menu, $ligne->rang);
					sql_executer($connexion, $requete);					
				}

				//on update le rangs des items déja présents
				if($value['select_menu_niveau'] != 0){
					$requete = sprintf("update `admin_menu` set  `rang`= `rang`+1 where `niveau_menu` = %d and `rang`>= %d", $value['select_menu_niveau'], $value['select_menu_rang']);
					sql_executer($connexion, $requete);
				}
				//fin de gestion du rang*************************************

				if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
					$out="Entrée modifiée";

					// On update l'entrée selectionnée
					$requete = "UPDATE `admin_menu` ";
					$requete .= " SET ";
					$requete .= "`id_menu_parent`= '".$value['select_menu_parent']."',  ";
					$requete .= "`libelle`= '".sql_encoder_requete($value['libelle_menu'])."', ";
					$requete .= "`url`= '".$value['url_menu']."', ";
					$requete .= "`etat`= '".$value['actif_menu']."', ";
					$requete .= "`id_priorite`= '".$value['select_menu_autorisation']."', ";
					$requete .= "`rang` = '".$value['select_menu_rang']."',";
					$requete .= "`titre_page`= '".sql_encoder_requete($value['titre_page'])."', ";
					$requete .= "`niveau_menu`= '".$value['select_menu_niveau']."' ";
					$requete .= " WHERE `admin_menu`.`id_menu` = '".$value['id_menu']."'";
					sql_executer($connexion, $requete);

					//on update le niveau des enfants de l'item modifié
					//$modifNiveau //0: on a pas modifié le niveau du menu, Positif : on descent de niveau (de 1 vers 2), Negatif : on remonte de niveau (de 2 vers 1)
					//$currentTree ;//  le menu qui nous interresse et ces descendants
					if($modifNiveau != 0){
						$newTarray = extractinfoByIdkey($currentTree,'id_menu', 'niveau_menu', 'add', $modifNiveau);
						foreach($newTarray as $idKey => $level){
							$requete = sprintf("UPDATE `admin_menu` SET `niveau_menu` = '%d' WHERE `admin_menu`.`id_menu` = '%d'",$level,$idKey);
							sql_executer($connexion, $requete);
						}
					}

					//on reconstruit l'arbo du menu
					$requete  = " select * ";
					$requete .= " from admin_menu m";
					$requete .= " where id_priorite >= ".$p_administrateur->id_priorite." ";
					//$requete .= " and etat != 0 ";
					$requete .= " order by m.niveau_menu, m.rang";
					$resultat = sql_executer($connexion, $requete);
					$menu = array();
					while ($ligne = sql_lire_ligne_objet($resultat)){
						$menu[] = $ligne;
					}
					$out = sprintf("Entrée %s modifiée",$value['libelle_menu']);

					$onclick = "onclick=\"xajax_gestionMenu('%d','modifier')\"";

					$list_menu = sprintf("<h3>Cliquer sur l'entrée à modifier</h3>");
					
					$list_menu .= affichage_hors_menu(listMenuLI(0, 0, $menu,$onclick));
					
					$created = sprintf("votre menu <a href=\"%s?action=page&id=%d\" >%s</a> a &eacute;t&eacute; modifi&eacute;;", $host_espace_index, $value['id_menu'], $value['libelle_menu']);
					$out = '';

				}
				else{//ajout d'une nouvelle entrée	
					//Insertion de l'item
					$id_menu = sql_ajouter_indice($connexion, 'admin_menu');
					$requete =" INSERT INTO `admin_menu` ";
					$requete .="(`id_menu`, `id_menu_parent`, `libelle`, `url`, `etat`, `id_priorite`, `rang`, `titre_page`, `niveau_menu`) ";
					$requete .="VALUES ('".$id_menu."',
										'".sql_encoder_requete($value['select_menu_parent'])."', 
										'".sql_encoder_requete($value['libelle_menu'])."', 
										'".sql_encoder_requete($value['url_menu'])."', 
										'".sql_encoder_requete($value['actif_menu'])."', 
										'".sql_encoder_requete($value['select_menu_autorisation'])."', 
										'".sql_encoder_requete($value['select_menu_rang'])."', 
										'".sql_encoder_requete($value['titre_page'])."', 
										'".sql_encoder_requete($value['select_menu_niveau'])."'
									)";

					$resultat = sql_executer($connexion, $requete);
					if (!$resultat) {
						$out = 'Une erreur est survenue : ' . mysql_error();
					}
					else{
						conf_id_page($id_menu, "create", $connexion);//on créé l'entrée dans le fichier conf.id_page.php
						
						$created = sprintf("votre menu <a href=\"%s?action=page&id=%d\" >%s</a> a &eacute;t&eacute; cr&eacute;&eacute;;", $host_espace_index, $id_menu, $value['libelle_menu']);
						$out = '';
					}


				}
				if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);

				if(isset($list_menu))$objResponse->assign('menu_actif', 'innerHTML', $list_menu);
				if($out != '')$objResponse->alert($out);
				else $objResponse->assign('modif_menu_actif', 'innerHTML', $created);
				$refresh = true; //rafraichir le menu general
			}//end if verif
			else{
				$objResponse->assign('error_menu', 'innerHTML', $verif);
			}
			break;
		default :
			break;
	}
	if($refresh == true){
		//rafraichir le menu general.
		$admin = recuperer_variable("administrateur", "");
		$t_menu = afficher_menu($_GET['id']);//tableau des id_menu parents de la page en cours
		$menu_horizontal = afficher_menu_horizontal($t_menu, $admin);//array
		$libelle_menu2 = $menu_horizontal['m2_libelle'];
			
		$refresh_menu_horizontal = $menu_horizontal['affiche'];
		$refresh_menu_vertical =  afficher_menu_vertical($t_menu,$libelle_menu2, $admin);

		$objResponse->assign('menu_horizontal', 'innerHTML', $refresh_menu_horizontal);
		$objResponse->assign('menu_vertical', 'innerHTML', $refresh_menu_vertical);
		//menu
	}

	if($alert!="")$script .= "xajax_alert(\"$alert\");";//debug

	if($verif == '')$objResponse->assign('error_menu', 'innerHTML', $verif);

	if($script != "") $objResponse->script($script);
	return $objResponse;

}

/*
 * gestionTache : xajax
 * formulaire correspondant a la création/modification de tache
 * appel de la fonction xajax correspondant a l'action souhaitée
 *
 */
function gestionTache($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   $verif = "";
   $out = '';
   $formTache = '';
   $legend = '';
   
   global $racine_admin;

   $requete  = " SHOW FULL COLUMNS FROM `admin_association_administrateur_taches`";
   $resultat = sql_executer($connexion, $requete);
   $tache = array();
   $i = 0;
   while ($ligne = sql_lire_ligne_objet($resultat)){
      if ($ligne->Field != 'id_administrateur') { // Passer la colonne des administrateurs concernés par les tâches
         $tache[$i] = $ligne;
         $i++;
      }
   }
  
   switch ($action){
      
      case "ajouter":
         $legend = 'Ajouter une entrée';
         
         $formTache .= sprintf("<input type=\"hidden\" id=\"action\" name=\"action\" value=\"%s\" />\n",$action);
         $formTache .= sprintf("<input type=\"image\" value=\"reset\" onclick=\"xajax_gestionTache('','ajouter');return false;\" class=\"img_normal\" alt=\"Réinitialiser\" title=\"Réinitialiser\" src=\"%sretour.png\" alt=\"reset\" />\n",$_SESSION['dossier_image']);
         $formTache .= sprintf("<input type=\"image\" value=\"Soumettre\" onclick=\"xajax_gestionFormTache(xajax.getFormValues(this.form),'submit');return false;\" class=\"tooltip img_normal\" alt=\"Soumettre\" title=\"Soumettre\" src=\"%svalider.png\" />\n",$_SESSION['dossier_image']);
         
         $out .= '<h3 style="display:inline;">Tâches&nbsp;existantes</h3>&nbsp;<span style="font-size:xx-small;"></span>';
         $onclick = "";
         $out .= listMenuLIOneLevel($tache,$onclick,'tache'); // affichage_hors_menu (listMenuLIOneLevel($menu,$onclick))
         
         if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
       
         break;

   }// end switch

   if($formTache != ''){

      //le formulaire en lui même
      $form =  "<form method =\"post\" id=\"form_new_tache\"  enctype=\"multipart/form-data\" action=\"javascript:\">\n";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"Field\" class=\"text\">";
      $form .= "Champ : ";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"Field\" name =\"Field\" value=\"%s\" /><br/>\n",isset($Field)?$Field:'');
      $form .= "  </p>\n";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"Comment\" class=\"text\">";
      $form .= "  Commentaire :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"Comment\" name =\"Comment\" value=\"%s\" /><br/>\n",isset($Comment)?$Comment:'');
      $form .= "  </p>";
      
      $formTache =  $form."<p class=\"envoy form\">".$formTache ."</p>";
      $formTache .= "</form>\n";
   }
   
   $objResponse->assign('legend_gestion_tache', 'innerHTML', $legend);
   $objResponse->assign('error_menu', 'innerHTML', $verif);
   $objResponse->assign('menu_actif', 'innerHTML', $out);
   $objResponse->assign('modif_menu_actif', 'innerHTML', $formTache);
   return $objResponse;
}

/*
 * gestionFormTache : xajax
 *
 * verifier la conformité du formulaire avant soumission
 *
 */
function gestionFormTache($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   global $host_espace_index;
   $error = "";
   $verif = "";
   $list_menu = "";
   $out = "";
   global $racine_admin;

   switch ($action) {
         
      case "submit":
         
         $value['Field'] = trim($value['Field']);
         $value['Comment'] = trim($value['Comment']);
         
         // Creation ou modification d'entrée

         // On verifie la validité des informations saisies
         $error = array();
         $error['Field'] = '';
         
         if(preg_replace('/\s/','',$value['Field']) == ""){
            $error['Field'] .= "<p>Le libellé de champ est obligatoire.</p>";
         } else {
            if ( ! preg_match('/^\w+$/i',$value['Field'])) { // Test restrictif sur les caractères admis dans le nom de colonne
               $error['Field'] .= "<p>Le libellé de champ contient des caractères interdits ou à éviter.</p>";
            }
         }
         
         $requete  = " SHOW FULL COLUMNS FROM `admin_association_administrateur_taches`";
         $resultat = sql_executer($connexion, $requete);
         while ($ligne = sql_lire_ligne_objet($resultat)){
            if ($ligne->Field == $value['Field']) {$error['Field'] .= "<p>Ce champ existe déjà.</p>";}
         }
   
         if(strlen($value['Field']) > 64){
            $error['Field'] .= "<p>Le libellé de champ est trop long.</p>";
         }
         
         $error['Comment'] = '';
         
         if(preg_replace('/\s/','',$value['Comment']) == ""){
            $error['Comment'] .= "<p>Le commentaire est obligatoire.</p>";
         } else {
            if ( ! preg_match('/^(\w+\s*\w*)+$/i',$value['Comment'])) { // Test restrictif sur les caractères admis dans le commentaire
               $error['Comment'] .= "<p>Seuls les caractères A-Z, a-z, 0-9, espaces et _ sont autorisés.</p>";
            }
         }
         
         if(strlen($value['Comment']) > 255){
            $error['Comment'] .= "<p>Le commentaire est trop long.</p>";
         }

         // end verification
         // On met en couleur le background des zones a problème et on affiche le texte d'erreur
         foreach ($value as $key => $val){
            if(isset($error[$key]) && $error[$key] != ''){
               $verif .= "<p>".$error[$key]."</p>";
               $objResponse->assign($key, 'style.background', '#FF6600');
            } else {
               $objResponse->assign($key, 'style.background', '#FFFFFF');
            }
         }
         //si tout est ok
         if($verif == ""){
            // Ajout d'un champ
            $requete  = sprintf(" ALTER TABLE `admin_association_administrateur_taches`");
            $requete .= sprintf(" ADD `%s` TINYINT( 1 ) NOT NULL DEFAULT '0' COMMENT '%s'", $value['Field'], addslashes($value['Comment']));
            $resultat = sql_executer($connexion, $requete);
            if (stristr($resultat, 'erreur') !== false) {
               $verif = '<p>Une erreur est survenue lors de l\'ajout : ' . $resultat. '.</p>';
            } else {
               $out = sprintf("<p>La tâche '%s' a &eacute;t&eacute; cr&eacute;&eacute;e.</p>", $value['Field']);
            }
            if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
            $objResponse->assign('error_menu', 'innerHTML', $verif);
            $objResponse->assign('modif_menu_actif', 'innerHTML', $out);
            $objResponse->assign('menu_actif', 'innerHTML', $list_menu);
         }//end if verif
         else{
            $objResponse->assign('error_menu', 'innerHTML', $verif);
         }
         
         break;
         
      default :
         break;
   }
   return $objResponse;
}

/*
 * gestionPriorite : xajax
 * formulaire correspondant a la création/modification de priorite
 * appel de la fonction xajax correspondant a l'action souhaitée
 *
 */
function gestionPriorite($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   $verif = "";
   $out = '';
   $formPriorite = '';
   $legend = '';
   
   global $racine_admin;
   
   $requete  = " SELECT * FROM `admin_priorite` p";
   $requete .= " ORDER BY p.`id_priorite`";
   $resultat = sql_executer($connexion, $requete);
   $priorite = array();
   while ($ligne = sql_lire_ligne_objet($resultat)){
      $priorite[$ligne->id_priorite] = $ligne;
   }

   switch ($action){
      case "ajouter":
         $legend = 'Ajouter une entrée';
         
         $formPriorite .= sprintf("<input type=\"hidden\" id=\"action\" name=\"action\" value=\"%s\" />\n",$action);
         $formPriorite .= sprintf("<input type=\"image\" value=\"reset\" onclick=\"xajax_gestionPriorite('','ajouter');return false;\" class=\"img_normal\" alt=\"Réinitialiser\" title=\"Réinitialiser\" src=\"%sretour.png\" alt=\"reset\" />\n",$_SESSION['dossier_image']);
         $formPriorite .= sprintf("<input type=\"image\" value=\"Soumettre\" onclick=\"xajax_gestionFormPriorite(xajax.getFormValues(this.form),'submit');return false;\" class=\"tooltip img_normal\" alt=\"Soumettre\" title=\"Soumettre\" src=\"%svalider.png\" />\n",$_SESSION['dossier_image']);
         
         $out .= '<h3 style="display:inline;">Priorités&nbsp;existantes</h3>&nbsp;<span style="font-size:xx-small;">(id&nbsp;-&nbsp;libellé)</span>';
         $onclick = "";
         $out .= listMenuLIOneLevel($priorite,$onclick,'priorite'); // affichage_hors_menu (listMenuLIOneLevel($menu,$onclick))
         
         if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
       
         break;
      case "modifier":
         $legend = 'Modifier une entrée';

         $out .= '<h3 style="display:inline;">Cliquer&nbsp;sur&nbsp;l\'entrée&nbsp;à&nbsp;modifier</h3>&nbsp;<span style="font-size:xx-small;">(id&nbsp;-&nbsp;libellé)</span>';
         $onclick = "onclick=\"xajax_gestionPriorite('%d','modifier')\"";
         $out .= listMenuLIOneLevel($priorite,$onclick,'priorite'); // affichage_hors_menu (listMenuLIOneLevel($menu,$onclick))

         if(is_string($value) && preg_match("/^\d+$/",$value)){

            //on stocke en session les variables utilisées pour l'affichage
            $_SESSION['modif_form_item_id']['id_priorite']      = $id_priorite  = $priorite[$value]->id_priorite;
            $_SESSION['modif_form_item_id']['libelle']          = $libelle      = $priorite[$value]->libelle;

            $formPriorite .= sprintf("<input type=\"hidden\" id=\"action\" name=\"action\" value=\"%s\" />\n",$action);
            $formPriorite .= sprintf("<input type=\"image\" value=\"Annuler\" alt=\"Annuler\" title=\"Annuler\" onclick=\"xajax_gestionPriorite('','modifier');return false;\" class=\"img_normal\" src=\"%sretour.png\" />\n",$_SESSION['dossier_image']);
            $formPriorite .= sprintf("<input type=\"image\" value=\"Modifier\" class=\"tooltip img_normal\" alt=\"Modifier\" title=\"Modifier\" onclick=\"xajax_gestionFormPriorite(xajax.getFormValues(this.form),'submit');return false;\"  src=\"%svalider.png\" alt=\"Modifier\" />\n",$_SESSION['dossier_image']);
            $formPriorite .= sprintf("<input type=\"image\" value=\"Supprimer\"  id = \"supprimer\"  class=\"tooltip img_normal\" alt=\"Supprimer\" title=\"Supprimer\" onclick = \"if(window.confirm('Confirmer la suppression de l\'item \'%s\' ?')== true){xajax_gestionFormPriorite(xajax.getFormValues(this.form),'supprimer');return false;}\" src=\"%ssupprimer.png\" />\n",addslashes(str_replace(array("'","\""),"",$libelle)), $_SESSION['dossier_image']);

         }//end if
         else $formPriorite = '';
         break;
   }// end switch

   if($formPriorite != ''){

      //le formulaire en lui même
      $form =  "<form method =\"post\" id=\"form_new_priorite\"  enctype=\"multipart/form-data\" action=\"javascript:\">\n";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"id_priorite\" class=\"text\">";
      $form .= "ID : ";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"id_priorite\" name =\"id_priorite\" value=\"%s\" /><br/>\n",isset($id_priorite)?$id_priorite:'');
      $form .= "  </p>\n";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"libelle\" class=\"text\">";
      $form .= "  Libell&eacute; :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"libelle\" name =\"libelle\" value=\"%s\" /><br/>\n",isset($libelle)?$libelle:'');
      $form .= "  </p>";
      
      $formPriorite =  $form."<p class=\"envoy form\">".$formPriorite ."</p>";
      $formPriorite .= "</form>\n";
   }
   
   $objResponse->assign('legend_gestion_priorite', 'innerHTML', $legend);
   $objResponse->assign('error_menu', 'innerHTML', $verif);
   $objResponse->assign('menu_actif', 'innerHTML', $out);
   $objResponse->assign('modif_menu_actif', 'innerHTML', $formPriorite);
   return $objResponse;
}

/*
 * gestionFormPriorite : xajax
 *
 * verifier la conformité du formulaire avant soumission
 *
 */
function gestionFormPriorite($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   global $host_espace_index;
   $error = "";
   $verif = "";
   $list_menu = "";
   $out = "";
   global $racine_admin;

   switch ($action) {
      
      case "supprimer":
         
         // On modifie une entrée existante 
         if(isset($_SESSION['modif_form_item_id'])){
            $id_priorite = $_SESSION['modif_form_item_id']['id_priorite'];
            // Que la priorité n'est pas Super Admin
            if ($id_priorite != 0) {
               $requete  = ' SELECT * FROM admin_administrateur';
               $requete .= ' WHERE `id_priorite` = ' . $id_priorite;
               $resultat = sql_executer($connexion, $requete);
               if(stristr($resultat, 'erreur') === false){
                  // Vérifier que la priorite n'est pas référencée dans la table admin_administrateur
                  if (sql_nombre_lignes($resultat) > 0){
                     $verif = "<p>Vous ne pouvez supprimer cet item car d'autres tables l'utilisent.</p>";
                  } else {
                     $requete = ' DELETE FROM `admin_priorite` WHERE `id_priorite` = ' . $id_priorite;
                     $resultat = sql_executer($connexion, $requete);
                     if(stristr($resultat, 'erreur') === false){
                        $out .= sprintf("<p>Entrée '%s' effacée.</p>",$_SESSION['modif_form_item_id']['id_priorite'] . ' - ' .$_SESSION['modif_form_item_id']['libelle']);
                        unset($_SESSION['modif_form_item_id']);
                     } else{
                        $verif .= "<p>Une erreur est survenue lors de la suppression : " . $resultat . ".</p>";//TODO
                     }
                  }
               }
            } else {
               $verif = sprintf("<p>L'entrée '%s' n'est pas éligible pour la suppression.</p>",$_SESSION['modif_form_item_id']['id_priorite'] . ' - ' .$_SESSION['modif_form_item_id']['libelle']);
               unset($_SESSION['modif_form_item_id']);
            }
            $objResponse->assign('error_menu', 'innerHTML', $verif);
            $objResponse->assign('modif_menu_actif', 'innerHTML', $out);
            $objResponse->assign('menu_actif', 'innerHTML', $list_menu);
         }

         break;
         
      case "submit":
         
         $value['id_priorite'] = trim($value['id_priorite']);
         $value['libelle'] = trim($value['libelle']);
         
         // Creation ou modification d'entrée

         // On verifie la validité des informations saisies
         $error = array();
         $error['id_priorite'] = '';
         
         if(    
                isset($_SESSION['modif_form_item_id']['id_priorite'])  // Mode modification...
             && $_SESSION['modif_form_item_id']['id_priorite'] == 0 // ...de la fiche à id 0...
             && $_SESSION['modif_form_item_id']['id_priorite'] != $value['id_priorite'] // ... et l'id ayany été changé
         ) {
            $error['id_priorite'] .= "<p>L'id 0 n'est pas éligible pour la modification.</p>";
         }
         
         if(preg_replace('/\s/','',$value['id_priorite']) == ""){
            $error['id_priorite'] .= "<p>L'id est obligatoire.</p>";
         }
         
         $check = preg_match('/^\d+?$/',$value['id_priorite']);
         if($check == 0 || $check === false) {
            $error['id_priorite'] .= "<p>L'id doit être un nombre.</p>";
         } else {
            //verification de l'unicité de l'id
            $requete  = " SELECT * FROM `admin_priorite`";
            $requete .= " WHERE `id_priorite` = '" . addslashes($value['id_priorite']) . "'";
            $resultat = sql_executer($connexion, $requete);
            if (
                  // Si on ajoute, la requête doit retourner 0 occurrence pour cet id
                  $value['action'] == 'ajouter' && sql_nombre_lignes($resultat) > 0
                  // En mode édition et si l'id a été modifié, la requête doit retourner 0 occurrence
               || $value['action'] == 'modifier' && $value['id_priorite'] != $_SESSION['modif_form_item_id']['id_priorite'] && sql_nombre_lignes($resultat) > 0
            ){
               if ($value['id_priorite'] == 0) {
                  $error['id_priorite'] .= "<p>L'id 0 existe déjà et n'est pas éligible pour la modification.</p>";
               } else {
                  $error['id_priorite'] .= "<p>Cet id existe déjà.</p>";
               }
            }
         }
         
         if(strlen($value['id_priorite']) > recupererTailleMaxChamp('admin_priorite','id_priorite')){
            $error['id_priorite'] .= "<p>L'id saisi est trop long.</p>";
         }
                  
         $error['libelle'] = '';
         
         if(preg_replace('/\s/','',$value['libelle']) == ""){
            $error['libelle'] .= "<p>Le libellé est obligatoire.</p>";
         }

         //verification de l'unicité du libellé
         $requete  = " SELECT * FROM `admin_priorite`";
         $requete .= " WHERE `libelle` = '" . addslashes($value['libelle']) . "'";
         $requete .= $value['action'] == 'modifier' ? sprintf(" AND `id_priorite` != %s", $_SESSION['modif_form_item_id']['id_priorite']) : "";
         $resultat = sql_executer($connexion, $requete);
         if (sql_nombre_lignes($resultat) > 0){
            $error['libelle'] .= "<p>Ce libellé existe déjà.</p>";
         }

         if(strlen($value['libelle']) > recupererTailleMaxChamp('admin_priorite','libelle')){
            $error['libelle'] .= "<p>Le libellé saisi est trop long.</p>";
         }
         
         if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
            // On verifie qu'il y a bien eu modification
            $modif = 0;
            foreach($value as $key => $diff){
               if($modif != 0)break;//il y a une modification => on sort
               switch ($key){
                  case 'id_priorite':
                     if($_SESSION['modif_form_item_id']['id_priorite'] != $diff)$modif=1;
                     break;
                  case 'libelle':
                     if($_SESSION['modif_form_item_id']['libelle'] != $diff)$modif=1;
                     break;
                  default:
                     break;
               }
            }
            if($modif == 0){
               $verif = "<p>Aucune modification n'a été effectuée.</p>";
            }
         }// end verification
         // On met en couleur le background des zones a problème et on affiche le texte d'erreur
         foreach ($value as $key => $val){
            if(isset($error[$key]) && $error[$key] != ''){
               $verif .= "<p>".$error[$key]."</p>";
               $objResponse->assign($key, 'style.background', '#FF6600');
            } else {
               $objResponse->assign($key, 'style.background', '#FFFFFF');
            }
         }
         //si tout est ok
         if($verif == ""){
            if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
               // On update l'entrée selectionnée
               $requete  = " UPDATE `admin_priorite`";
               $requete .= " SET ";
               $requete .= " `id_priorite` = '" . addslashes($value['id_priorite']) . "',";
               $requete .= " `libelle` = '" . addslashes($value['libelle']) . "'";
               $requete .= " WHERE `id_priorite` = '".$_SESSION['modif_form_item_id']['id_priorite']."'";
               $resultat = sql_executer($connexion, $requete);
               if (stristr($resultat, 'erreur') !== false) {
                  $verif = '<p>Une erreur est survenue lors de la mise à jour : ' . $resultat . '.</p>';
               } else {
                  $out = sprintf("<p>La priorite '%s' a &eacute;t&eacute; modifi&eacute;e.</p>", $value['id_priorite'] . ' - ' . $value['libelle']);
               }
               //on reconstruit l'arbo du menu
               $requete  = " SELECT * FROM `admin_priorite` p";
               $requete .= " ORDER BY p.`id_priorite`";
               $resultat = sql_executer($connexion, $requete);
               $priorite = array();
               while ($ligne = sql_lire_ligne_objet($resultat)){
                  $priorite[$ligne->id_priorite] = $ligne;
               }
               $onclick = "onclick=\"xajax_gestionPriorite('%d','modifier')\"";
               $list_menu = sprintf("<h3>Cliquer sur l'entrée à modifier</h3>");
               $list_menu .= listMenuLIOneLevel($priorite,$onclick,'priorite');
            } else {//ajout d'une nouvelle entrée  
               //Insertion de l'item
               $requete  = " INSERT INTO `admin_priorite` ";
               $requete .= "(`id_priorite`, `libelle`) ";
               $requete .= "VALUES ('".addslashes($value['id_priorite'])."',
                                    '".addslashes($value['libelle'])."' 
                                   )";
               $resultat = sql_executer($connexion, $requete);
               if (stristr($resultat, 'erreur') !== false) {
                  $verif = '<p>Une erreur est survenue lors de l\'ajout : ' . $resultat . '.</p>';
               } else {
                  $out = sprintf("<p>La priorite '%s' a &eacute;t&eacute; cr&eacute;&eacute;e.</p>", $value['id_priorite'] . ' - ' . $value['libelle']);
               }
            }
            if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
            $objResponse->assign('error_menu', 'innerHTML', $verif);
            $objResponse->assign('modif_menu_actif', 'innerHTML', $out);
            $objResponse->assign('menu_actif', 'innerHTML', $list_menu);
         }//end if verif
         else{
            $objResponse->assign('error_menu', 'innerHTML', $verif);
         }
         
         break;
         
      default :
         break;
   }
   return $objResponse;
}

/*
 * gestionStructure : xajax
 * formulaire correspondant a la création/modification de structure
 * appel de la fonction xajax correspondant a l'action souhaitée
 *
 */
function gestionStructure($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   $verif = "";
   $out = "";
   $formStructure = "";
   $legend = "";
   
   global $racine_admin;

   switch ($action){
      
      case "ajouter":
         
         $legend = 'Ajouter une entrée';
         $formStructure .= sprintf("<input type=\"hidden\" id=\"action\" name=\"action\" value=\"%s\" />\n",$action);
         $formStructure .= sprintf("<input type=\"image\" value=\"reset\" onclick=\"xajax_gestionStructure('','ajouter');return false;\" class=\"img_normal\" alt=\"Réinitialiser\" title=\"Réinitialiser\" src=\"%sretour.png\" alt=\"reset\" />\n",$_SESSION['dossier_image']);
         $formStructure .= sprintf("<input type=\"image\" value=\"Soumettre\" onclick=\"xajax_gestionFormStructure(xajax.getFormValues(this.form),'submit');return false;\" class=\"tooltip img_normal\" alt=\"Soumettre\" title=\"Soumettre\" src=\"%svalider.png\" />\n",$_SESSION['dossier_image']);
         if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
       
         break;
         
      case "modifier":
         
         $legend = 'Modifier une entrée';
         $requete  = " SELECT * FROM `admin_structure` s";
         $requete .= " ORDER BY s.`nom`";
         $resultat = sql_executer($connexion, $requete);
         $structure = array();
         while ($ligne = sql_lire_ligne_objet($resultat)){
            $structure[$ligne->id_structure] = $ligne;
         }

         $out .= "<h3>Cliquer sur l'entrée à modifier</h3>";
         $onclick = "onclick=\"xajax_gestionStructure('%d','modifier')\"";
         $out .= listMenuLIOneLevel($structure,$onclick,'structure'); // affichage_hors_menu (listMenuLIOneLevel($menu,$onclick))

         if(is_string($value) && preg_match("/^\d+$/",$value)){

            //on stocke en session les variables utilisées pour l'affichage
            $_SESSION['modif_form_item_id']['id_structure'] = $id_structure  = $structure[$value]->id_structure;
            $_SESSION['modif_form_item_id']['nom']          = $nom           = $structure[$value]->nom;
            $_SESSION['modif_form_item_id']['adresse1']     = $adresse1      = $structure[$value]->adresse1;
            $_SESSION['modif_form_item_id']['adresse2']     = $adresse2      = $structure[$value]->adresse2;
            $_SESSION['modif_form_item_id']['code_postal']  = $code_postal   = $structure[$value]->code_postal;
            $_SESSION['modif_form_item_id']['ville']        = $ville         = $structure[$value]->ville;
            $_SESSION['modif_form_item_id']['tel']          = $tel           = $structure[$value]->tel;
            $_SESSION['modif_form_item_id']['fax']          = $fax           = $structure[$value]->fax;
            $_SESSION['modif_form_item_id']['email']        = $email         = $structure[$value]->email;
            $_SESSION['modif_form_item_id']['site']         = $site          = $structure[$value]->site;

            $formStructure .= sprintf("<input type=\"hidden\" id=\"action\" name=\"action\" value=\"%s\" />\n",$action);
            $formStructure .= sprintf("<input type=\"hidden\" id=\"id_structure\" name=\"id_structure\" value=\"%d\" />\n",$id_structure);
            $formStructure .= sprintf("<input type=\"image\" value=\"Annuler\" alt=\"Annuler\" title=\"Annuler\" onclick=\"xajax_gestionStructure('','modifier');return false;\" class=\"img_normal\" src=\"%sretour.png\" />\n",$_SESSION['dossier_image']);
            $formStructure .= sprintf("<input type=\"image\" value=\"Modifier\" class=\"tooltip img_normal\" alt=\"Modifier\" title=\"Modifier\" onclick=\"xajax_gestionFormStructure(xajax.getFormValues(this.form),'submit');return false;\"  src=\"%svalider.png\" alt=\"Modifier\" />\n",$_SESSION['dossier_image']);
            $formStructure .= sprintf("<input type=\"image\" value=\"Supprimer\"  id = \"supprimer\"  class=\"tooltip img_normal\" alt=\"Supprimer\" title=\"Supprimer\" onclick = \"if(window.confirm('Confirmer la suppression de l\'item \'%s\' ?')== true){xajax_gestionFormStructure(xajax.getFormValues(this.form),'supprimer');return false;}\" src=\"%ssupprimer.png\" />\n",addslashes(str_replace(array("'","\""),"",$nom)), $_SESSION['dossier_image']);

         }//end if
         else $formStructure = '';
         break;
   }// end switch

   if($formStructure != ''){

      //le formulaire en lui même
      $form =  "<form method =\"post\" id=\"form_new_structure\"  enctype=\"multipart/form-data\" action=\"javascript:\">\n";

      if(isset($_SESSION['modif_form_item_id']['id_structure'])){
         $form .= "  <p class=\"form\">\n";
         $form .= "  <label for=\"id_structure\" class=\"text\">";
         $form .= "ID : ";
         $form .= "  </label>\n";
         $form .= sprintf("<span class=\"text\" id=\"id_structure\">%d</span>",$_SESSION['modif_form_item_id']['id_structure']);
         $form .= "  </p>\n";
      }

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"nom\" class=\"text\">";
      $form .= "  Nom :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"nom\" name =\"nom\" value=\"%s\" /><br/>\n",isset($nom)?$nom:'');
      $form .= "  </p>";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"adresse1\" class=\"text\">";
      $form .= "  Adresse 1 :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"adresse1\" name =\"adresse1\" value=\"%s\" /><br/>\n",isset($adresse1)?$adresse1:'');
      $form .= "  </p>";

      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"adresse2\" class=\"text\">";
      $form .= "  Adresse 2 :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"adresse2\" name =\"adresse2\" value=\"%s\" /><br/>\n",isset($adresse2)?$adresse2:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"code_postal\" class=\"text\">";
      $form .= "  Code postal :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"code_postal\" name =\"code_postal\" value=\"%s\" /><br/>\n",isset($code_postal)?$code_postal:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"ville\" class=\"text\">";
      $form .= "  Ville :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"ville\" name =\"ville\" value=\"%s\" /><br/>\n",isset($ville)?$ville:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"tel\" class=\"text\">";
      $form .= "  T&eacute;l&eacute;phone :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"tel\" name =\"tel\" value=\"%s\" /><br/>\n",isset($tel)?$tel:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"fax\" class=\"text\">";
      $form .= "  Fax :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"fax\" name =\"fax\" value=\"%s\" /><br/>\n",isset($fax)?$fax:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"email\" class=\"text\">";
      $form .= "  E-mail :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"email\" name =\"email\" value=\"%s\" /><br/>\n",isset($email)?$email:'');
      $form .= "  </p>";
      
      $form .= "  <p class=\"form\">\n";
      $form .= "  <label for=\"site\" class=\"text\">";
      $form .= "  Site :";
      $form .= "  </label>\n";
      $form .= sprintf("<input type=\"text\" class=\"text\" id=\"site\" name =\"site\" value=\"%s\" /><br/>\n",isset($site)?$site:'');
      $form .= "  </p>";
      
      $formStructure =  $form."<p class=\"envoy form\">".$formStructure ."</p>";
      $formStructure .= "</form>\n";
   }
   
   $objResponse->assign('legend_gestion_structure', 'innerHTML', $legend);
   $objResponse->assign('error_menu', 'innerHTML', $verif);
   $objResponse->assign('menu_actif', 'innerHTML', $out);
   $objResponse->assign('modif_menu_actif', 'innerHTML', $formStructure);
   return $objResponse;
}

/*
 * gestionFormStructure : xajax
 *
 * verifier la conformité du formulaire avant soumission
 *
 */
function gestionFormStructure($value,$action){
   $objResponse = new xajaxResponse();
   $connexion = sql_connecter();
   $p_administrateur = recuperer_variable("administrateur", "");
   global $host_espace_index;
   $error = "";
   $verif = "";
   $list_menu = "";
   $out = "";
   global $racine_admin;

   switch ($action) {
      
      case "supprimer":
         
         // On supprime une entrée existante
         if(isset($_SESSION['modif_form_item_id'])){    
            $id_structure = $_SESSION['modif_form_item_id']['id_structure'];
            // Vérifier que la structure n'est pas Semantia
            if ($id_structure != 0) {
               $requete  = ' SELECT * FROM admin_administrateur';
               $requete .= ' WHERE `id_structure` = ' . $id_structure;
               $resultat = sql_executer($connexion, $requete);
               if(stristr($resultat, 'erreur') === false){
                  // Vérifier que la structure n'est pas référencée dans la table admin_administrateur
                  if (sql_nombre_lignes($resultat) > 0){
                     $verif .= "<p>Vous ne pouvez supprimer cet item car d'autres tables l'utilisent.</p>";
                  } else {
                     $requete = ' DELETE FROM `admin_structure` WHERE `id_structure` = ' . $id_structure;
                     $resultat = sql_executer($connexion, $requete);
                     if(stristr($resultat, 'erreur') === false){
                        $out .= sprintf("<p>Entrée '%s' effacée.</p>",$_SESSION['modif_form_item_id']['nom']);
                        unset($_SESSION['modif_form_item_id']);
                     } else{
                        $verif .= "<p>Une erreur est survenue lors de la suppression : " . $resultat . ".</p>";
                     }
                  }
               }
            } else {
               $verif .= sprintf("<p>L'entrée '%s' n'est pas éligible pour la suppression.</p>",$_SESSION['modif_form_item_id']['nom']);
               unset($_SESSION['modif_form_item_id']);
            }
            $objResponse->assign('error_menu', 'innerHTML', $verif);
            $objResponse->assign('modif_menu_actif', 'innerHTML', $out);
            $objResponse->assign('menu_actif', 'innerHTML', $list_menu);
         }

         break;
         
      case "submit":
         
         $value['nom']         = trim($value['nom']);
         $value['adresse1']    = trim($value['adresse1']);
         $value['adresse2']    = trim($value['adresse2']);
         $value['code_postal'] = trim($value['code_postal']);
         $value['ville']       = trim($value['ville']);
         $value['tel']         = trim($value['tel']);
         $value['fax']         = trim($value['fax']);
         $value['email']       = trim($value['email']);
         $value['site']        = trim($value['site']);
         
         //creation ou modification d'entrée
         
         // On verifie la validité des informations saisies
         $error = array();
         $error['nom'] = '';
         
         if(preg_replace('/\s/','',$value['nom']) == ""){
            $error['nom'] .= "<p>le nom est obligatoire.</p>";
         }

         // Vérification de l'unicité du nom
         $requete  = " SELECT * FROM `admin_structure`";
         $requete .= " WHERE `nom` = '" . addslashes($value['nom']) . "'";
         $requete .= $value['action'] == 'modifier' ? sprintf(" AND `id_structure` != %s", $value['id_structure']) : "";
         $resultat = sql_executer($connexion, $requete);
         if (sql_nombre_lignes($resultat) > 0){
            $error['nom'] .= "<p>Ce nom existe déjà.</p>";
         }

         if(strlen($value['nom']) > recupererTailleMaxChamp('admin_structure','nom')){
            $error['nom'] .= "<p>Le nom saisi est trop long.</p>";
         }
         
         if(strlen($value['adresse1']) > recupererTailleMaxChamp('admin_structure','adresse1')){
            $error['adresse1'] = "<p>La première adresse saisie est trop longue.</p>";
         }
         
         if(strlen($value['adresse2']) > recupererTailleMaxChamp('admin_structure','adresse2')){
            $error['adresse1'] = "<p>La seconde adresse saisie est trop longue.</p>";
         }
         
         $error['code_postal'] = '';
         
         if(strlen($value['code_postal']) > recupererTailleMaxChamp('admin_structure','code_postal')){
            $error['code_postal'] .= "<p>Le code postal est trop long.</p>";
         }
         
         if(preg_match('/^(\d\d\d\d\d)?$/',$value['code_postal']) == 0){
            $error['code_postal'] .= "<p>Le code postal doit comporter 5 chiffres.</p>";
         }
         
         if(strlen($value['ville']) > recupererTailleMaxChamp('admin_structure','ville')){
            $error['ville'] = "<p>Le nom de la ville est trop long.</p>";
         }
         
         if(strlen($value['tel']) > recupererTailleMaxChamp('admin_structure','tel')){
            $error['tel'] = "<p>Le numéro de téléphone est trop long.</p>";
         }
         
         if(strlen($value['fax']) > recupererTailleMaxChamp('admin_structure','fax')){
            $error['fax'] = "<p>Le numéro de fax est trop long.</p>";
         }
         
         if(strlen($value['email']) > recupererTailleMaxChamp('admin_structure','email')){
            $error['email'] = "<p>L'adresse mail est trop longue.</p>";
         }
         
         if(strlen($value['site']) > recupererTailleMaxChamp('admin_structure','site')){
            $error['site'] = "<p>L'adresse du site est trop longue.</p>";
         }
         
         if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
            // On verifie qu'il y a bien eu modification
            $modif = 0;
            foreach($value as $key => $diff){
               if($modif != 0)break;//il y a une modification => on sort
               switch ($key){
                  case 'nom':
                     if($_SESSION['modif_form_item_id']['nom'] != $diff)$modif=1;
                     break;
                  case 'addresse1':
                     if($_SESSION['modif_form_item_id']['addresse1'] != $diff)$modif=1;
                     break;
                  case 'adresse2':
                     if($_SESSION['modif_form_item_id']['adresse2'] != $diff)$modif=1;
                     break;
                  case 'code_postal':
                     if($_SESSION['modif_form_item_id']['code_postal'] != $diff)$modif=1;
                     break;
                  case 'ville':
                     if($_SESSION['modif_form_item_id']['ville'] != $diff)$modif=1;
                     break;
                  case 'tel':
                     if($_SESSION['modif_form_item_id']['tel'] != $diff)$modif=1;
                     break;
                  case 'fax':
                     if($_SESSION['modif_form_item_id']['fax'] != $diff)$modif=1;
                     break;
                  case 'email':
                     if($_SESSION['modif_form_item_id']['email'] != $diff)$modif=1;
                     break;
                  case 'site':
                     if($_SESSION['modif_form_item_id']['site'] != $diff)$modif=1;
                     break;
                  default:
                     break;
               }
            }
            if($modif == 0){
               $verif .= "<p>Aucune modification n'a été effectuée.</p>";
            }
         }// end verification
         // On met en couleur le background des zones à problème et on affiche le texte d'erreur
         foreach ($value as $key => $val){
            if(isset($error[$key]) && $error[$key] != ''){
               $verif .= "<p>".$error[$key]."</p>";
               $objResponse->assign($key, 'style.background', '#FF6600');
            } else {
               $objResponse->assign($key, 'style.background', '#FFFFFF');
            }
         }
         //si tout est ok
         if($verif == ""){
            if(isset($_SESSION['modif_form_item_id'])){//on modifie une entrée existante
               // On update l'entrée selectionnée
               $requete  = " UPDATE `admin_structure`";
               $requete .= " SET ";
               $requete .= " `nom` = '" . addslashes($value['nom']) . "',";
               $requete .= " `adresse1` = '" . addslashes($value['adresse1']) . "',";
               $requete .= " `adresse2` = '" . addslashes($value['adresse2']) . "',";
               $requete .= " `code_postal` = '" . addslashes($value['code_postal']) . "',";
               $requete .= " `ville` = '" . addslashes($value['ville']) . "',";
               $requete .= " `tel` = '" . addslashes($value['tel']) . "',";
               $requete .= " `fax` = '" . addslashes($value['fax']) . "',";
               $requete .= " `email` = '" . addslashes($value['email']) . "',";
               $requete .= " `site` = '" . addslashes($value['site']) . "'";
               $requete .= " WHERE `id_structure` = '".$value['id_structure']."'";
               $resultat = sql_executer($connexion, $requete);
               if (stristr($resultat, 'erreur') !== false) {
                  $verif .= '<p>Une erreur est survenue lors de la mise à jour : ' . $resultat . ".</p>";
               } else {
                  $out .= sprintf("<p>La structure '%s' a &eacute;t&eacute; modifi&eacute;e.</p>", $value['nom']);
               }
               //on reconstruit l'arbo du menu
               $requete  = " SELECT * FROM `admin_structure` s";
               $requete .= " ORDER BY s.`nom`";
               $resultat = sql_executer($connexion, $requete);
               $structure = array();
               while ($ligne = sql_lire_ligne_objet($resultat)){
                  $structure[$ligne->id_structure] = $ligne;
               }
               $onclick = "onclick=\"xajax_gestionStructure('%d','modifier')\"";
               $list_menu = sprintf("<h3>Cliquer sur l'entrée à modifier</h3>");
               $list_menu .= listMenuLIOneLevel($structure,$onclick,'structure');
            } else {//ajout d'une nouvelle entrée  
               //Insertion de l'item
               $id_structure = sql_ajouter_indice($connexion, 'admin_structure');
               $requete  = " INSERT INTO `admin_structure` ";
               $requete .= "(`id_structure`, `nom`, `adresse1`, `adresse2`, `code_postal`, `ville`, `tel`, `fax`, `email`, `site`) ";
               $requete .= "VALUES ('".$id_structure."',
                                    '".addslashes($value['nom'])."', 
                                    '".addslashes($value['adresse1'])."', 
                                    '".addslashes($value['adresse2'])."', 
                                    '".addslashes($value['code_postal'])."', 
                                    '".addslashes($value['ville'])."', 
                                    '".addslashes($value['tel'])."', 
                                    '".addslashes($value['fax'])."', 
                                    '".addslashes($value['email'])."',
                                    '".addslashes($value['site'])."'
                                   )";
               $resultat = sql_executer($connexion, $requete);
               if (stristr($resultat, 'erreur') !== false) {
                  $verif .= '<p>Une erreur est survenue lors de la création : ' . $resultat . ".</p>";
               } else {
                  $out .= sprintf("<p>La structure '%s' a &eacute;t&eacute; cr&eacute;&eacute;e</p>", $value['nom']);
               }
            }
            if(isset($_SESSION['modif_form_item_id'])) unset($_SESSION['modif_form_item_id']);
            $objResponse->assign('error_menu', 'innerHTML', $verif);
            $objResponse->assign('modif_menu_actif', 'innerHTML', $out);
            $objResponse->assign('menu_actif', 'innerHTML', $list_menu);  
         }//end if verif
         else{
            $objResponse->assign('error_menu', 'innerHTML', $verif);
         }
         
         break;
         
      default :
         break;
   }
   return $objResponse;
}

/**
 * Récupère la taille maximale autorisée pour le champ d'une table
 * 
 * @param $p_table   Nom de la table (avec ou sans ``)
 * @param $p_champ   Nom du champ dont on veut récupérer la taille maximale (avec ou sans ``)
 */
function recupererTailleMaxChamp ($p_table, $p_champ) {
   $connexion = sql_connecter();
   global $db_defaut;
   $requeteDescribe = sprintf('DESCRIBE %s %s', $p_table, $p_champ);
   $resultatDescribe = sql_executer($connexion, $requeteDescribe);
   $tableau = sql_lire_ligne_tableau($resultatDescribe);
   // Récupère la taille des différents types char et int
   if(strpos($tableau['Type'],'char') !== 0 || strpos($tableau['Type'],'int') !== 0) {
      $tailleMax = substr($tableau['Type'], strpos($tableau['Type'],'(') + 1, strpos($tableau['Type'],'(') - 1);
   }
   return (int) $tailleMax;
}

function conf_id_page($id_menu, $action, $connexion){

	global $file_conf_id_page;
	
	
	$ligne_id_page = $ligne_page_link = "";
	$lines 						= file($file_conf_id_page);
	$file_conf_id_page_ecrire 	= fopen($file_conf_id_page, "w");
	
	$requete 					= sprintf("SELECT * FROM `admin_menu` where id_menu = %d", $id_menu);
	$resultat 					= sql_executer($connexion, $requete);
	$ligne_sql_admin_menu 		= sql_lire_ligne_objet($resultat);
	
	$array_find 				= array(".php", ".html", "/", ".");
	$array_replace 				= array("", "", "_");

	$name_id_page 				= sprintf('$id_page%s', str_replace($array_find,$array_replace, $ligne_sql_admin_menu->url));//$id_page_administration_index = 1;//administration/index.php
	$name_page_link 			= sprintf('$page%s', str_replace($array_find, $array_replace, $ligne_sql_admin_menu->url));	//$page_administration_index = sprintf("%s?action=page&amp;id=%d", $host_espace_index, $id_page_administration_index);
	
	
	
	
	
	switch ($action){
		case "create" : 
			$ligne_id_page 		= sprintf('%s = %d;//%s', $name_id_page, $id_menu, $ligne_sql_admin_menu->url);
			$ligne_page_link 	= sprintf('%s = %s',$name_page_link ,'sprintf("%s?action=page&amp;id=%d", $host_espace_index, '. $name_id_page .');');
			
			$lines = str_replace("?>", "", implode("",$lines));
			
			fwrite($file_conf_id_page_ecrire, $lines);
			fwrite($file_conf_id_page_ecrire, $ligne_id_page ."\n");
			fwrite($file_conf_id_page_ecrire, $ligne_page_link ."\n");
			fwrite($file_conf_id_page_ecrire, "\n?>");

			break;
		case "delete" : 
			
			foreach ($lines as $line_num => $line) {
			$pattern_name_id_page = "/".str_replace("$","",$name_id_page)."/";
			$pattern_name_page_link = "/".str_replace("$","",$name_page_link)."/";
			   if(preg_match($pattern_name_id_page, $line))	$lines[$line_num] = "";
			   if(preg_match($pattern_name_page_link,$line))$lines[$line_num] = "";
			}
			
			fwrite($file_conf_id_page_ecrire, implode("",$lines));
			break;
		
	}
	
	fclose($file_conf_id_page_ecrire);
}


/*
 * DeepestArray : retourne la branche la plus longue dans un tableau de tableaux
 */
function DeepestArray($tab)
{
	if (!is_array($tab) || count($tab) == 0) //si c'est la fin de l'arbre
	return 0;

	/* sinon, on recupere le maximum de max_pommes pour chaque branche */
	$max = 0;
	foreach($tab as $branche) {
		$pommes_branche = DeepestArray($branche);
		if ($max < $pommes_branche) //si la branche est mieux que le max actuel
		$max = $pommes_branche;
	}
	return 1 + $max; //on compte la pomme présente à l'embranchement, donc +
}


/*
 * extractinfoByIdkey :
 * fonction ad-hoc, completement specifique. /!\ réutiliser avec precautions
 *
 * return : un tableau avec comme indice $array[$id_key] et comme valeur $array[$neddle]
 *
 * input :
 * $array le tableau multidimensionnel
 * $id_key : la clé faisant reference a la valeur qui sera utilisé comme clé pour le tableau de retour
 * $neddle : la clé dont on veut mofifier la valeur
 * $op : l'action ($newvalue) a effectuer sur $neddle
 * $newvalue : la valeur a affecter a $neddle
 */
function extractinfoByIdkey($array,$id_key,$neddle,$op,$newvalue){
	static $outputarray = array();

	foreach($array as $key => $value){
		if(is_array($value)){
			extractinfoByIdkey($value,$id_key,$neddle,$op,$newvalue);
		}
		elseif($key === $neddle){
			switch ($op){
				case "add":
					$outputarray[$array[$id_key]] = $value+$newvalue;
					break;
				case "concat":
					$outputarray[$array[$id_key]] = $value.$newvalue;
					break;
				case "replace":
					$outputarray[$array[$id_key]]= $newvalue;
					break;
				default:
					break;
			}
		}
	}
	return $outputarray;
}


/*
 * listBreve
 * retourne un tableau de tableaux contenant le breves
 * $id : id de la breve, si =0 => on affiche tout les breves
 * $tri : permet d'ajouter un tri
 */
function listBreve($id,$tri=''){
	$connexion = sql_connecter();
	$breve = array();
	$rq ="SELECT * FROM `admin_breves` ";
	$rq .= ($id!= '0' || $tri=='!expire')?' Where ':'';
	if($id!= '0'){
		$rq .= " `id_breve` = $id ";
	}
	$rq .= ($id!= '0' && $tri=='!expire')?' and ':'';
	if($tri=='!expire'){//permet de ne pas afficher les breves expirés
		$rq .= "( `expire` >= NOW( )
		OR `expire` = '0000-00-00' )";
	}
	$rq .= "ORDER BY `admin_breves`.`titre`, `admin_breves`.`created` DESC";
	$resultat = sql_executer($connexion, $rq);
	$nb_line = sql_nombre_lignes($resultat);
	if ($nb_line){
		while ($ligne = sql_lire_ligne_tableau($resultat)){
			$breve[] = $ligne;
		}
	}
	return $breve;
}


/*
 * gestionBreve : xajax
 * créer et modifier des breves
 */

function gestionBreve($value, $action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$script = '';
	$verif = "";
	$alert = "";
	$legend = isset($value['action_breve'])?$value['action_breve'] != "modifier"?$value['action_breve'] != "ajouter"?"":"Ajouter un breve":"Modifier une breve":"";
	$out= "";

	if(!is_array($value)){// lorsque l'on ne passe que l'id
		$array = array("titre_breve","resume_breve","text_breve","create_breve","expire_breve");
		foreach($array as $key  ){
			$objResponse->assign($key, 'style.background', '#FFFFFF');
			$objResponse->assign($key, 'value', '');
		}
		//$script .= sprintf("tinyMCE.getInstanceById('text_breve').getWin().document.body.style.backgroundColor='#FFFFFF';");
	}

	$button_modifier = isset($value['action_breve'])&&$value['action_breve']=="modifier"||$action=="modifier"?sprintf("<input type=\"image\" value=\"Supprimer\"  id=\"supprimer\" class=\"tooltip img_normal\" title=\"Supprimer\" alt=\"Supprimer\" src=\"%ssupprimer.png\" onclick=\"if(window.confirm('Confirmer la supression?')== true){xajax_gestionBreve(xajax.getFormValues(this.form),'supprimer');return false;}\" />",$_SESSION['dossier_image']):"";

	$button_valid_breve = 	sprintf("<input type=\"image\" value=\"Annuler\" id=\"annuler\" class=\"tooltip img_normal\" title=\"Annuler\" alt=\"Annuler\" src=\"%sretour.png\" onclick=\"xajax_gestionBreve('','cancel');return false;\" />",$_SESSION['dossier_image']);
	$button_valid_breve .= 	sprintf("<input type=\"image\" value=\"Valider\" id=\"valider\" class=\"tooltip img_normal\" title=\"Valider\" alt=\"Valider\" src=\"%svalider.png\" onclick=\"tinyMCE.triggerSave();xajax_gestionBreve(xajax.getFormValues(this.form),'valider');return false;\" />",$_SESSION['dossier_image']);
	$button_valid_breve .= 	sprintf($button_modifier);

	if(isset($value['text_breve']) && $value['text_breve'] !="" && isset($value['action_breve']) && $value['action_breve']=="modifier"){
		$value['text_breve'] = utf8_encode(html_entity_decode($value['text_breve']));//hack tinymce
	}


	switch ($action) {
		case "cancel":

			$objResponse->assign('form_breve_div', 'style.display', 'none');
			//$objResponse->assign('list_modif_breve', 'style.display', 'none');

			foreach ($value as $key => $val){
				$objResponse->assign($key, 'style.background', '#FFFFFF');
				$objResponse->assign($key, 'value', '');
			}
			$objResponse->assign('expire_breve', 'value', '0000-00-00');
			$script .= sprintf("tinyMCE.getInstanceById('text_breve').getWin().document.body.style.backgroundColor='#FFFFFF';");
			$script .= sprintf("tinyMCE.getInstanceById('text_breve').setContent(\"%s\");", '' );
			break;
		case "ajouter":
			$legend = $value;
			$objResponse->assign('list_modif_breve', 'style.display', 'none');
			$objResponse->assign('form_breve_div', 'style.display', '');
			$objResponse->assign('action_breve', 'value', 'ajouter');//hidden input
			//initialisation du formulaire
			$objResponse->assign('create_breve', 'value', date('d-m-Y'));
			$objResponse->assign('expire_breve', 'value', '00-00-0000');
			$script .= sprintf("tinyMCE.getInstanceById('text_breve').getWin().document.body.style.backgroundColor='#FFFFFF';");
			$script .= sprintf("tinyMCE.getInstanceById('text_breve').setContent(\"%s\");", '' );
			break;
		case "modifier":
			$legend = "Modifier une breve";
			$objResponse->assign('action_breve', 'value', 'modifier');//hidden input
			if(preg_match("/^\d+$/",$value)){//id de la breve : int
				$breves = listBreve($value);
				if(count($breves) ==0)break;//l'id passé ne correspond à aucune breve

				$objResponse->assign('form_breve_div', 'style.display', '');

				$fill_form = array("id_breve" =>$breves[0]['id_breve'],
								"titre_breve" => $breves[0]['titre'],
								"resume_breve" => $breves[0]['pitch'],

								"text_breve" => $breves[0]['content'],
								"create_breve" => implode("-",array_reverse(explode("-",$breves[0]['created']))),
								"expire_breve" => implode("-",array_reverse(explode("-",$breves[0]['expire'])))

				);
				//assignation du contenu
				foreach ($fill_form as $key => $input){
					$objResponse->assign($key, 'value', $input);
				}
				sleep(2);
				$objResponse->script("tinyMCE.getInstanceById('text_breve').setContent('". preg_replace('~(?s)[\r\n]~', '', $breves[0]['content'])  ."');");//This converts all output into one line of code so the textarea can read it when loading it back in to the editor
				//$script .= sprintf("tinyMCE.getInstanceById('text_breve').setContent(\"%s\");",  addslashes($breves[0]['content']));

			}
			else{
				//liste toutes les breves
				$breves = listBreve('0','tri');
				$inactive = "";
				$active = "";
				$list_breve = "";
					
				//creation de la liste html
				for($i=0; $i<=count($breves); $i++){
					if(isset($breves[$i])){
						$list_breve =sprintf("<p class=''><a onclick='xajax_gestionBreve(\"%d\",\"modifier\");return false '>%s</a><br/>
												<span class='breve_date'>expire le %s</span></p>",$breves[$i]['id_breve'],$breves[$i]['titre'],implode("-",array_reverse(explode("-",$breves[$i]['expire']))));
						//séparation des breves actives des breves expirés
						$expire = str_replace('-','',$breves[$i]['expire']);
						if($expire<date('Ymd') &&  $expire != '00000000'){
							$inactive .= $list_breve;
						}
						else{
							$active .= $list_breve;
						}
					}
				}

				$list_breve = "<h2>Breves actives</h2>$active";
				$list_breve .= $inactive ==""?"":"<hr class='clear' /><h2>Breves expir&eacute;es</h2>$inactive";

				$objResponse->assign('list_modif_breve', 'innerHTML', $list_breve);
				$objResponse->assign('form_breve_div', 'style.display', 'none');
			}

			$objResponse->assign('list_modif_breve', 'style.display', '');

			break;
		case "supprimer" :
			$requete = " DELETE FROM `admin_breves` WHERE `breves`.`id_breve` = '".$value['id_breve']."'";
			$resultat = sql_executer($connexion, $requete);
			if (!$resultat) {
				$out = 'Une erreur est survenue : ' . mysql_error();
			}
			else {
				$verif = "La breve ".$value['titre_breve']." &agrave; &eacute;t&eacute; suprim&eacute;e.";
				$script .= "xajax_gestionBreve(\"$out\",'modifier');";
			}
			break;
		case "valider":
			if($value['action_breve']=="modifier"){
				$breves = listBreve($value['id_breve']);
				if(is_array($breves)){
					$veriff = "";
					$this_breve = array(
								"id_breve" =>$breves[0]['id_breve'],
								"titre_breve" => $breves[0]['titre'],
								"resume_breve" => $breves[0]['pitch'],
								"text_breve" => $breves[0]['content'],
								"create_breve" => implode("-",array_reverse(explode("-",$breves[0]['created']))),
								"expire_breve" => implode("-",array_reverse(explode("-",$breves[0]['expire'])))

					);

					//on verifie qu'il y a bien eu modification
					$modif = '';
					foreach($value as $key => $diff){
						if($key == 'id_breve' && $this_breve[$key] != $value[$key]){//cas peu probable mais a envisager
							$verif ="<p>Modification d'id impossible</p>";
						}
						if(isset($this_breve[$key]) && $this_breve[$key] != $value[$key]){
							$modif = 1;
							break;//il y a une modification => on sort
						}
					}
					if($modif == ""){
						$verif = "<p>Aucune modification n'a été effectuée</p>";
					}
				}//end if is_array
				//else $alert .= "\$breves $breves";//debug
			}//end if modifier

			foreach($value as $key => $input){
				$value[$key] = $input = mysql_escape_input(trim($input));//nettoyage des données saisie
				switch ($key){
					case "titre_breve":
						if(trim($input) =="")$error[$key] = 'Le champs titre ne peut etre vide';
						break;
					case "resume_breve":
						if($input =="")$error[$key] = 'Le champs r&eacute;sum&eacute ne peut etre vide';
						break;
					case "text_breve":
						if($input == "")$error[$key] = "Le champs texte ne peut etre vide";
						break;
					case "expire_breve":
						//$pattern = "/^\d\d\d\d\-\d\d\-\d\d$/";
						$pattern = "/^\d\d\-\d\d\-\d\d\d\d$/";
						preg_match($pattern,$input,$matches);
						$input = implode("",array_reverse(explode("-",$input)));
						//$input = str_replace("-","",trim($input));
						if($input == ""){
							$error[$key] = "La date d'expiration ne peut etre vide";
							$objResponse->assign('expire_breve', 'value', '00-00-0000');
						}
						elseif(!isset($matches[0])){
							$error[$key] = "La date d'expiration doit etre au format suivant : jj-mm-aaaa";
						}
						elseif($input == date('Ymd')){
							$error[$key] = "Les dates de creation et d'expiration ne peuvent etre identiques";
						}
						elseif((($value['action_breve']=="ajouter" && $input < date('Ymd')) || ($value['action_breve']=="modifier" && $input < implode("",array_reverse(explode("-",$this_breve['create_breve'])))))&& $input!='00000000'){
							$error[$key] = sprintf("La date d'expiration (%s) ne peut etre inferieure à la date de création (%s)",$value[$key],$value['action_breve']=="ajouter"?date('d-m-Y'):$value['create_breve']);
						}

						break;
					default:
						break;
				}//end switch $key

				//on passe en rouge le background des zones a problemes
				if(isset($error[$key])){
					$verif .= $error[$key]."<br />";
					$objResponse->assign($key, 'style.background', '#FF6600');
					if($key == 'text_breve') $script .= sprintf("tinyMCE.getInstanceById('text_breve').getWin().document.body.style.backgroundColor='#FF6600';");//tinymce
				}
				else {
					$objResponse->assign($key, 'style.background', '#FFFFFF');
					if($key == 'text_breve') $script .= sprintf("tinyMCE.getInstanceById('text_breve').getWin().document.body.style.backgroundColor='#FFFFFF';");//tinymce
				}
			}//end foreach $value

			if($verif == ""){
				if($value['action_breve']=="ajouter"){
					//insertion de la breve, le champs modified se rempli et se met a jour seul
					$id_breve = sql_ajouter_indice($connexion, 'admin_breves');
					$requete = "
					INSERT INTO `admin_breves` (`id_breve` ,`titre` ,`pitch` ,`content` ,`created` ,`modified` ,`expire` ,`id_author`)
					VALUES ('".$id_breve."',
						'".sql_encoder_requete($value['titre_breve'])."',
						'".sql_encoder_requete($value['resume_breve'])."',
						'".sql_encoder_requete($value['text_breve'])."',
						'".date('Y-m-d')."',
						'',
						'".implode("-",array_reverse(explode("-",$value['expire_breve'])))."', 
						'". $_SESSION['administrateur']->id_administrateur ."'
					)";
					$resultat = sql_executer($connexion, $requete);
					if (!$resultat) {
						$out = 'Une erreur est survenue : ' . mysql_error();
					}
					else{
						$out = sprintf("Nouvelle brève \"%s\"ajoutée ",$value['titre_breve']);
						$objResponse->call('xajax_gestionBreve','','cancel');
					}
				}
				elseif($value['action_breve']=="modifier"){
					$requete = "
					UPDATE `admin_breves` 
					set `titre` = '".sql_encoder_requete($value['titre_breve'])."',
						`pitch` = '".sql_encoder_requete($value['resume_breve'])."',
						`content` = '".sql_encoder_requete($value['text_breve'])."',
						`expire` = '".implode("-",array_reverse(explode("-",$value['expire_breve'])))."',
						`id_author`= '". $_SESSION['administrateur']->id_administrateur ."'
					 WHERE `breves`.`id_breve` ='".$value['id_breve']."'
					";
					$resultat = sql_executer($connexion, $requete);
					if (!$resultat) {
						$out = 'Une erreur est survenue : ' . mysql_error();
					}
					else $out = sprintf("La breve \"%s\" a été modifiée.",$value['titre_breve']);

					$objResponse->call('xajax_gestionBreve',"Modifier une breve", 'modifier');
				}
			}// end if $verif==""
			if($out != "") $objResponse->alert($out);
			break;
		default:
			break;
	}

	$objResponse->assign('button_valid_breve', 'innerHTML', $button_valid_breve);
	$objResponse->assign('legend_gestion_breve', 'innerHTML', $legend);

	$refreshBreve = afficher_breves_menu();
	$objResponse->assign('menu_breves', 'innerHTML', $refreshBreve);
	$objResponse->assign('error_breve', 'innerHTML', $verif);
	if($alert != "") $script .= "xajax_alert('$alert');";
	if($script != "") $objResponse->script($script);

	return $objResponse;
}


/*
 *  listRaccourci
 *  retourne tous les raccourcis d'un utilisateur si id_menu n'est pas spécifié
 *  sinon, retourne le raccourcis a l'id specifié
 */
function listRaccourcis($p_admin, $id_menu=''){

	$id_administrateur = $p_admin->id_administrateur;
	$connexion = sql_connecter();
	$requete  = " select m.*, am.* ";
	$requete .= "from admin_menu m, `admin_association_administrateur_menu` am ";
	$requete .= " where id_administrateur = $id_administrateur ";
	$requete .= " and m.id_menu = am.id_menu ";
	$requete .= $id_menu ==''?'':" and m.id_menu = $id_menu";

	$resultat = sql_executer($connexion, $requete);

	$raccourcis = array();

	while ($ligne = sql_lire_ligne_objet($resultat)){
		$raccourcis[] = $ligne;
	}

	return $raccourcis;
}


/**
 * list_menu
 * retourne une liste les entrées de menu auquelles l'utilisateur courant peut acceder, au format html
 * @param $parent
 * @param $niveau
 * @param $array
 * @param $onclick
 */
function listMenuLI($parent, $niveau, $array ,$onclick ="") {
	$html = "";
	$niveau_precedent = 0;

	if (!$niveau && !$niveau_precedent) $html .= "\n<ul>\n";

	foreach ($array as $ligne) {
		if ($ligne->id_menu_parent == $parent) {

			if ($niveau_precedent < $niveau) $html .= "\n<ul>\n";

			$raccourcis = '';
			if(isset($ligne->raccourci)){
				$button_valider_small = 	$_SESSION['dossier_image']."valider_small.png";
				$button_supprimer_small = 	$_SESSION['dossier_image']."supprimer_small.png";

				if($ligne->raccourci == 'supprimer') 	$raccourcis=sprintf("<input type=\"image\" value=\"Supprimer\" src='%s' alt='' title='Supprimer' />",$button_supprimer_small);
				elseif($ligne->raccourci == 'ajouter')	$raccourcis=sprintf("<input type=\"image\" value=\"Ajouter\" src='%s' alt='' title='Ajouter' />",$button_valider_small);
				$onclick = sprintf("onclick=\"if(window.confirm('%s le raccourci \'%s\'') == true){xajax_gestionRaccourcis('%s','%s');return false;}\"",$ligne->raccourci,$ligne->libelle,'%d',$ligne->raccourci);
			}

			$niv0 = $ligne->niveau_menu == 0?"Niv0":"";
				
			if($onclick =='')$html .= sprintf("<li>%s<a class=\"menu_menu03_lien\" >%s</a>", $niv0, $ligne->libelle);
			else 			$html .= sprintf("<li>%s<a class=\"menu_menu03_lien\"  $onclick >%s %s</a>", $niv0, $ligne->id_menu, $raccourcis, $ligne->libelle);

			$niveau_precedent = $niveau;

			$html .= listMenuLI($ligne->id_menu, ($niveau + 1), $array,$onclick);
		}
	}
	if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) $html .= "</ul>\n</li>\n";
	else if ($niveau_precedent == $niveau) $html .= "</ul>\n";
	else $html .= "</li>\n";


	return $html;
}

/**
 * listMenuLIOneLevel
 * retourne une liste les entrées de menu auquelles l'utilisateur courant peut acceder, au format html
 * @param $p_array
 * @param $p_onclick
 * @param $p_switch
 */
function listMenuLIOneLevel($p_array, $p_onclick = "", $p_switch) {

   $button_valider_small =    $_SESSION['dossier_image']."valider_small.png";
   $button_supprimer_small =  $_SESSION['dossier_image']."supprimer_small.png";
   
   $html =  "\n<ul>\n";

   switch ($p_switch){
      case 'structure':
         foreach ($p_array as $ligne) {
            $raccourcis = '';
            if(isset($ligne->raccourci)){
               if($ligne->raccourci == 'supprimer')   $raccourcis=sprintf("<input type=\"image\" value=\"Supprimer\" src='%s' alt='' title='Supprimer' />",$button_supprimer_small);
               elseif($ligne->raccourci == 'ajouter') $raccourcis=sprintf("<input type=\"image\" value=\"Ajouter\" src='%s' alt='' title='Ajouter' />",$button_valider_small);
               $p_onclick = sprintf("onclick=\"if(window.confirm('%s le raccourci \'%s\'') == true){xajax_gestionRaccourcis('%s','%s');return false;}\"",$ligne->raccourci,$ligne->nom,'%d',$ligne->raccourci);
            }
            if($p_onclick == '') $html .= sprintf("<li><a class=\"menu_menu03_lien\" >%s</a>", $ligne->nom);
            else  $html .= sprintf("<li><a class=\"menu_menu03_lien\"  $p_onclick >%s %s</a>", $ligne->id_structure, $raccourcis, $ligne->nom);
         }
      break;
      case 'priorite':
         foreach ($p_array as $ligne) {
            $raccourcis = '';
            if(isset($ligne->raccourci)){
               if($ligne->raccourci == 'supprimer')   $raccourcis=sprintf("<input type=\"image\" value=\"Supprimer\" src='%s' alt='' title='Supprimer' />",$button_supprimer_small);
               elseif($ligne->raccourci == 'ajouter') $raccourcis=sprintf("<input type=\"image\" value=\"Ajouter\" src='%s' alt='' title='Ajouter' />",$button_valider_small);
               $p_onclick = sprintf("onclick=\"if(window.confirm('%s le raccourci \'%s\'') == true){xajax_gestionRaccourcis('%s','%s');return false;}\"",$ligne->raccourci,$ligne->libelle,'%d',$ligne->raccourci);
            }
            if($p_onclick == '') $html .= sprintf("<li>%s", (strlen($ligne->id_priorite) < 2 ? '&nbsp;&nbsp;' . $ligne->id_priorite : $ligne->id_priorite) . ' - ' . $ligne->libelle);
            else  $html .= sprintf("<li><a class=\"menu_menu03_lien\"  $p_onclick >%s %s</a>", $ligne->id_priorite, $raccourcis, (strlen($ligne->id_priorite) < 2 ? '&nbsp;&nbsp;' . $ligne->id_priorite : $ligne->id_priorite) . ' - ' . $ligne->libelle);
         }
      break;
      case 'tache':
         foreach ($p_array as $k => $v) {
            if($p_onclick == '') $html .= sprintf("<li title=\"%s\">%s", $v->Comment, $v->Field);
         }
      break;
   }

   $html .= "</ul>\n";

   return $html;
}


/*
 * gestionRaccourcis : xajax
 * ajouter ou supprimer des raccourcis spécifiques a l'utilisateur
 *
 */
function gestionRaccourcis($value, $action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$alert = "";
	$out = "";
	$p_administrateur = recuperer_variable("administrateur", "");
	$script = '';

	//liste des raccourcis de l'utilisateur courant
	$raccourcis = listRaccourcis($p_administrateur,$value);
	array_unshift($raccourcis, "");//auto hack de la fonction recursiveArraySearch() qui ne gere pas l'indice 0

	//liste des entrées de menu
	$requete  = " select niveau_menu,id_menu,libelle,id_menu_parent ";
	$requete .= " from admin_menu m";
	$requete .= " where id_priorite >= ".$p_administrateur->id_priorite." ";
	$requete .= " and etat != 0 ";
	$requete .= " order by m.niveau_menu, m.rang";
	$resultat = sql_executer($connexion, $requete);
	$menu = array();

	while ($ligne = sql_lire_ligne_objet($resultat)){
			
		$ligne->raccourci = 'ajouter';
		$obj = recursiveArraySearch($raccourcis, $ligne->id_menu, 'id_menu');
		if($obj != false){
			$ligne->raccourci = 'supprimer';
		}
		$menu[] = $ligne;
	}

	switch ($action) {

		case "new":
			$out .= "<h3>Selectionner une entrée</h3>";
			//$out .= "<div class=\"float_left\"><ul>".listMenuLImg(0, 0, $menu)."</ul></div>";
			
			$out .= affichage_hors_menu(listMenuLI(0, 0, $menu,$onclick));
			
			break;
		case "ajouter":
			$listRaccourcisValue = listRaccourcis($p_administrateur,$value);
			if(count($listRaccourcisValue) == 0)
			{
				$requete  = "INSERT INTO `admin_association_administrateur_menu`  ";
				$requete .= " (`id_administrateur` ,`id_menu`)";
				$requete .= sprintf(" VALUES (%d, %d)",$p_administrateur->id_administrateur ,$value);
				if(!sql_executer($connexion, $requete))break;
				$listRaccourcisValue = listRaccourcis($p_administrateur,$value);
				$out .= sprintf("Raccourci <span class=\"ajout_raccourcis\">%s</span> ajouté",$listRaccourcisValue[0]->libelle);

			}
			break;
		case "supprimer":
			$listRaccourcisValue = listRaccourcis($p_administrateur,$value);

			$requete  = " DELETE FROM `admin_association_administrateur_menu` ";
			$requete .= sprintf("  WHERE `admin_association_administrateur_menu`.`id_administrateur` = %d  ",$p_administrateur->id_administrateur);
			$requete .= sprintf("  AND `admin_association_administrateur_menu`.`id_menu` = %d ",$listRaccourcisValue[0]->id_menu);
			$requete .= "LIMIT 1";
			if(!sql_executer($connexion, $requete))break;

			$out .= sprintf("Raccourci <span class=\"ajout_raccourcis\">%s</span> effacé",$listRaccourcisValue[0]->libelle);
			break;
		default:
			break;
	}

	$refreshOutils = afficher_mes_outils($p_administrateur);
	$objResponse->assign('menu_outils', 'innerHTML', $refreshOutils);

	if($alert!="")$script .= "xajax_alert('$alert');";//debug
	if($script != "") if($script != "") $objResponse->script($script);
	$objResponse->assign('creer_raccourci', 'innerHTML', $out);
	return $objResponse;
}


/*
 * gestionRegle : xajax
 * Ajouter ou modifier des regles de reduction
 */
function gestionRegle($value,$action){
	$objResponse = new xajaxResponse();
	$connexion = sql_connecter();
	$alert = "";
	$out = "";
	$error = '';
	$legend = "Consulter les règles";
	$p_administrateur = recuperer_variable("administrateur", "");
	$script = '';

	$button_submit			= sprintf("<input type=\"image\" value=\"soumettre\" 	onclick=\" xajax_gestionRegle(xajax.getFormValues(this.form),'submit');return false;\" class=\"tooltip img_normal\" alt=\"soumettre\" 	title=\"soumettre\" src=\"%svalider.png\" />",$_SESSION['dossier_image']);
	$button_cancel 			= sprintf("<input type=\"image\" value=\"annuler\" 		onclick=\" xajax_gestionRegle(xajax.getFormValues(this.form),'cancel');return false;\" class=\"tooltip img_normal\" alt=\"annuler\" 	title=\"annuler\" 	src=\"%sretour.png\" />",$_SESSION['dossier_image']);
	$button_correspondance 	= "<input type=\"button\" value=\"voir la correspondance\" 	onclick=\"document.getElementById('terme_droit_select').innerHTML = '';document.getElementById('terme_gauche_select').innerHTML = '';xajax_gestionRegle(xajax.getFormValues(this.form),'correspondance');return false;\" />";
	$button_ajouter 		= "<input type=\"button\" value =\"Ajouter une regle :\" 	onclick=\"xajax_gestionRegle(xajax.getFormValues(this.form),'ajouterRegle');return false;\" />";
	$button_modifier 		= "<input type=\"button\" value =\"Modifier une regle :\" 	onclick=\"xajax_gestionRegle(xajax.getFormValues(this.form),'modifierRegle');return false;\" disabled=\"disabled\"/>";
	$view_terme_gauche 		= "";
	$view_terme_droit 		= "";
	$terme_droit_select 	= "";
	$terme_gauche_select 	= "";

	foreach($value as $key => $toto){
		if($key !='action_regle')$value[$key] = mysql_escape_input(strtoupper($toto));
	}

	//on charge les libelle des marques
	if(isset($value['libelle_marque_select'])){
		$requete = sprintf("SELECT `id_marque`,`libelle_marque` FROM `regle_reduction` group by `libelle_marque`");
		$resultat = sql_executer($connexion, $requete);
		while ($ligne = sql_lire_ligne_objet($resultat)) {
			$marqueTab[$ligne->id_marque] = $ligne->libelle_marque;
		}
	}



	switch ($action){
		case "clear_suggest" :
			$button_submit = "";
			$button_cancel = "";
			break;
		case "suggest": //suggestion d'entrée valides pour completion du texte saisi
			$button_submit 	= '';
			$button_cancel 	= '';
			//seul l'un des deux peut ne pas etre vide
			if($value['terme_gauche'] != '' || $value['terme_droit'] != '' ){
				$gauche = isset($value['terme_gauche'])?$value['terme_gauche']:"";
				$droit = isset($value['terme_gauche'])?$value['terme_droit']:"";

				$terme_input = $terme_output = "droit";
				if($value['terme_gauche']  != "")$terme_input = "gauche";
				else $terme_output = "gauche";


				$requete = sprintf("select * from `regle_reduction` where `terme_%s` LIKE '%s%%' ",$terme_input,$$terme_input);
				if($value['libelle_marque_select'] != '-1'){
					$requete .= sprintf("and id_marque= '%d' %s ",$value['libelle_marque_select'], $terme_input=="droit"?"group by `terme_droit`":"");
				}
				else{
					$requete .= sprintf("%s order by id_marque", $terme_input=="droit"?"group by `terme_droit`":"");
				}

				//$alert .= "<p>". addslashes($requete) ."</p>";//debug
				$resultat = sql_executer($connexion, $requete);

				if(!$resultat)
				{
					$$terme_input = 'error gestionRegle() suggest '. mysql_error();
				}
				elseif(mysql_num_rows($resultat) > 0)
				{
					$i = 0;
					$$terme_input = sprintf('<table id = "list_suggest_terme_%s" class = "suggest_list">',$terme_input);
					while ($ligne = sql_lire_ligne_objet($resultat))
					{
						$$terme_input .= sprintf("<tr class = \"suggest\" id = \"suggest_%s%d\"",$terme_input,$i);
						$$terme_input .= sprintf("			onmouseover = 	\"document.getElementById('suggest_%s%d').className = 'suggest_highlight';\" ",$terme_input,$i);
						$$terme_input .= sprintf("			onmouseout = 	\"document.getElementById('suggest_%s%d').className = 'suggest';\" ",$terme_input,$i);
						$$terme_input .= sprintf("			onclick = 		\"document.getElementById('terme_%s').value = '%s';",$terme_input,$terme_input=="droit"?$ligne->terme_droit:$ligne->terme_gauche);
						$$terme_input .= sprintf("							document.getElementById('terme_%s').focus();",$terme_input);
						if($value['libelle_marque_select'] == '-1')
						$$terme_input .= sprintf("document.getElementById('%s').selected = 'selected';",str_replace(" ","",$marqueTab[$ligne->id_marque]));
						$$terme_input .= sprintf("							document.getElementById('terme_%s_select').innerHTML = '';\">",$terme_input);
						$$terme_input .= sprintf("	<td >%s %s </td>",$terme_input=="droit"?$ligne->terme_droit:$ligne->terme_gauche, $value['libelle_marque_select'] == '-1'?' ('.$marqueTab[$ligne->id_marque].')':'');
						$$terme_input .= sprintf("		</tr>\n");
						$i++;
					}
					$$terme_input .= sprintf("</table>\n");
				}
				else $$terme_input = "rien";//debug
					
				$terme_gauche_select = $gauche;
				$terme_droit_select = $droit;
			}
			break;//end suggest
		case "correspondance_effacement":
			$value['terme_gauche'] = '';
			$value['terme_droit'] = '%#%';

		case "correspondance"://affiche les correspondances pour le terme saisi
			//seul l'un des deux peut ne pas etre vide
			if($value['terme_gauche'] != '' || $value['terme_droit'] != ''){
				if($value['libelle_marque_select'] != -1){

					if($value['terme_droit'] == '%#%')$value['terme_droit'] = '';//feinte pour afficher les regles d'effacement

					$gauche = isset($value['terme_gauche'])?$value['terme_gauche']:"";
					$droit = isset($value['terme_droit'])?$value['terme_droit']:"";


					$terme_input = $terme_output = "droit";

					if($value['terme_gauche']  != "")$terme_input = "gauche";//donc, si droit est vide, $terme_input = droit
					else $terme_output = "gauche";

					$requete = sprintf("select * from `regle_reduction` where `terme_%s` ='%s' and id_marque= '%d' ",$terme_input,$$terme_input,$value['libelle_marque_select']);
					$requete .=sprintf("%s", $terme_input == "gauche"?" group by `terme_droit` ":"");

					$resultat = sql_executer($connexion, $requete);

					if(!$resultat){
						$$terme_output = 'error gestionRegle() correspondance '. mysql_error();
					}
					elseif(mysql_num_rows($resultat) > 0){
						$$terme_output .= sprintf("<ul>\n");
						$num_rows = sql_nombre_lignes($resultat);

						while($ligne = sql_lire_ligne_objet($resultat)){
							$ligne->terme_droit = $ligne->terme_droit == "" ?"Ce terme correspond à une règle d'effacement" : $ligne->terme_droit;
							$$terme_output .= sprintf('<li>%s</li>'."\n",$terme_input == "gauche"?$ligne->terme_droit:$ligne->terme_gauche);
						}
						$$terme_output .= sprintf("</ul>\n");
						$$terme_input = "<ul><li>". $$terme_input ."</ul></li>";
						$button_modifier = "<input type=\"button\" value =\"Modifier une regle :\" 	onclick=\"xajax_gestionRegle(xajax.getFormValues(this.form),'modifierRegle');return false;\" />";
					}
					else{
						$$terme_output .= sprintf("Ce terme %s n'a pas de correspondance ",$terme_input);
					}
					$view_terme_gauche = $gauche;
					$view_terme_droit = $droit;
					$error = '';
				}
				else{
					$error = "Vous devez selectionner une marque!";
				}
			}
			else{
				$view_terme_gauche  = "";
				$view_terme_droit = "";
			}
			$button_submit 	= '';
			$button_cancel 	= '';
			break;
		case "cancel"://annulation de ajouter ou modifier
			$button_submit 	= '';
			$button_cancel 	= '';
			$objResponse->assign('action_regle', 'value', '');
			$objResponse->assign('terme_gauche', 'style.display', '');
			$objResponse->assign('terme_droit', 'style.display', '');
			$error = '';
			break;
		case "ajouterRegle":
			$legend = "Ajouter une règle";
			$error = '';
			if($value['terme_gauche'] == '' && $value['terme_droit'] == '' ){
				$error .= "Terme d'entrée ou de sortie obligatoire<br/>\n";
			}
			if($value['libelle_marque_select'] == '-1'){
				$error .= "Selection de la marque obligatoire<br/>\n";
			}

			if($error == ""){
				$button_correspondance 	= '';
				$button_ajouter 		= '';
				$button_modifier 		= '';
				$terme_gauche_select =	sprintf("<input type=\"text\" value=\"%s\" id=\"terme_gauche_modif\" 	name=\"terme_gauche_modif\"  %s />",$value['terme_gauche'], $value['terme_gauche']==""?"onkeyup=\"this.value=this.value.toUpperCase();\"":"readonly=\"readonly\"");
				$terme_droit_select =	sprintf("<input type=\"text\" value=\"%s\" id=\"terme_droit_modif\" 	name=\"terme_droit_modif\"   %s />",$value['terme_droit'], $value['terme_droit']==""?"onkeyup=\"this.value=this.value.toUpperCase();\"":"readonly=\"readonly\"");
				$objResponse->assign('action_regle', 'value', 'ajouterRegle');
				$objResponse->assign('terme_gauche', 'style.display', 'none');
				$objResponse->assign('terme_droit', 'style.display', 'none');
			}
			else{
				$button_submit 	= '';
				$button_cancel 	= '';
				$objResponse->assign('terme_gauche', 'style.display', '');
				$objResponse->assign('terme_droit', 'style.display', '');
			}
			break;
		case "modifierRegle":
			$legend = "Modifier une règle";

			$objResponse->assign('action_regle', 'value', 'modifierRegle');

			$gauche = isset($value['terme_gauche'])?$value['terme_gauche']:"";
			$droit = isset($value['terme_gauche'])?$value['terme_droit']:"";


			$terme_input = $terme_output = "droit";

			if($value['terme_gauche']  != "")$terme_input = "gauche";
			else $terme_output = "gauche";

			$requete = sprintf("select * from `regle_reduction` where `terme_%s` ='%s' and id_marque= '%d' ",$terme_input,$$terme_input,$value['libelle_marque_select']);
			$requete .=sprintf("%s", $terme_input == "gauche"?" group by `terme_droit` ":"");

			$resultat = sql_executer($connexion, $requete);

			if(!$resultat){
				$error = 'error gestionRegle() correspondance '. mysql_error();
			}
			elseif(mysql_num_rows($resultat) > 0){
				$gauche = sprintf("<ul>\n");
				$num_rows = sql_nombre_lignes($resultat);

				while($ligne = sql_lire_ligne_objet($resultat)){
					$gauche .= sprintf('<li>
										<input type="image" src="%3$s" alt="supprimer cette règle." class="img_small" onclick="if(window.confirm(\'Confirmer la suppression de cette relation :\n %1$s => %4$s\') == true){xajax_gestionRegle(\'%2$d\',\'supprimerRegle\');xajax_gestionRegle(xajax.getFormValues(this.form),\'correspondance\');return false;};"/>
										<input type="hidden" name="old_regle_%2$d" id="old_regle_%2$d" value="%1$s"/>
										<input type="text" name="new_regle_%2$d" id="new_regle_%2$d" value="%1$s" style="width:auto;" onkeyup="this.value=this.value.toUpperCase();" />
									</li>'."\n",$ligne->terme_gauche,$ligne->id_regle_reduction,$_SESSION['dossier_image']."supprimer_small.png",$ligne->terme_droit);
					if($droit != ""){//c'est donc le terme droit qui a été saisi et une seule règle correspond a cette requete
						$droit = sprintf('<ul><li>
										<input type="hidden" name="old_regle_droit_00" id="old_regle_droit_00" value="%1$s"/>
										<input type="text" name="new_regle_droit_00" id="new_regle_droit_00" value="%1$s" style="width:auto;" onkeyup="this.value=this.value.toUpperCase();" />
										</li>
										<li>&nbsp;</li>
										<li>Attention, la modification du terme droit s\'applique à tous ses termes gauches</li>
									</ul>'."\n",$ligne->terme_droit);
					}
					else{
						$droit = sprintf('<ul><li>
										<input type="hidden" name="old_regle_droit_%2$d" id="old_regle_droit_%2$d" value="%1$s"/>
										<input type="text" name="new_regle_droit_%2$d" id="new_regle_droit_%2$d" value="%1$s" style="width:auto;"/></li>
									</ul>'."\n",$ligne->terme_droit,$ligne->id_regle_reduction);
					}
				}
				$gauche .= sprintf("</ul>\n");
			}
			$objResponse->assign('terme_gauche', 'style.display', 'none');
			$objResponse->assign('terme_droit', 'style.display', 'none');
			$view_terme_gauche = $gauche;
			$view_terme_droit = $droit;
			$button_correspondance 	= '';
			$button_ajouter 		= '';
			$button_modifier 		= '';
			break;
		case "supprimerRegle" :
			$error = '';
			$objResponse->assign('terme_gauche', 'style.display', '');
			$objResponse->assign('terme_droit', 'style.display', '');
			$requete = sprintf("DELETE FROM `regle_reduction` WHERE `regle_reduction`.`id_regle_reduction` = %d ", $value);
			$resultat = sql_executer($connexion, $requete);
			break;
		case "submit":
			//ajouter ou modifier une regle

			if($value['action_regle'] == "ajouterRegle"){
				$legend = "Ajouter règle";
				if($value['terme_gauche_modif'] == "")$error = "le terme gauche ne peut être vide";//le terme droit peut etre vide, cela genere une regle d'effacement
				else{
					$requete = sprintf("select * from `regle_reduction` where `terme_gauche` = '%s' and `terme_droit` = '%s'",$value['terme_gauche_modif'],$value['terme_droit_modif']);
					$requete .= sprintf("and id_marque= '%d'",$value['libelle_marque_select']);
					$resultat = sql_executer($connexion, $requete);
					if(sql_nombre_lignes($resultat) >0)$error = "Cette regle est déjà existante";
					else{
						$requete = sprintf("select * from `regle_reduction` where `terme_gauche` = '%s' ",$value['terme_gauche_modif']);
						$requete .= sprintf("and id_marque= '%d'",$value['libelle_marque_select']);
						$resultat = sql_executer($connexion, $requete);
						if(sql_nombre_lignes($resultat) >0)$error = "Ce terme gauche est déjà lié à un terme droit,\nAllez dans la section modifier.";
						else{
							$requete = sprintf("SELECT MAX(`id_regle_reduction`) as maxid FROM `regle_reduction`");
							$resultat = sql_executer($connexion, $requete);
							$ligne = sql_lire_ligne_objet($resultat);
							$maxId = $ligne->maxid;

							$requete = sprintf( "insert into regle_reduction (`id_regle_reduction`,`id_marque`,`libelle_marque`,`terme_gauche`,`long_terme_gauche`,`terme_droit`,`long_terme_droit`)
											VALUES ('%d','%d',(select `libelle` from bdc_marque where bdc_marque.id_marque = '%d' limit 1),'%s',LENGTH('%s'),'%s',LENGTH('%s'));",
							++$maxId,$value['libelle_marque_select'],$value['libelle_marque_select'],$value['terme_gauche_modif'],$value['terme_gauche_modif'],$value['terme_droit_modif'],$value['terme_droit_modif']);

							$resultat = sql_executer($connexion, $requete);
							if(!$resultat)$error = "un erreur est survenue : ".mysql_error();
							else{
								$objResponse->call('xajax_gestionRegle',$value,'correspondance');
							}
						}
					}
				}
			}
			if($value['action_regle'] == "modifierRegle"){
				$legend = "Modifier une règle";
				$regle_droit = false;
				$regle_gauche = false;
				$modif_regle = array();//=>index = id,contient 1 hash par terme gauche old_value,new_value,droit_value
				foreach($value as $key => $toto ){
					if(preg_match("/new_regle_(droit_)?(\d+)/",$key,$match)){
						if($value['old_regle_'.$match[1].$match[2]] != $toto){
							if($match[1]!="") $regle_droit = $toto;
							elseif($toto == "") $error = sprintf("le terme gauche %s=> %s (old : %s) ne peut être vide",'new_regle_'.$match[2],$value['new_regle_'.$match[2]],$value['old_regle_'.$match[2]]);//le terme droit peut etre vide, cela genere une regle d'effacement
							else $regle_gauche = true;
						}
						if($match[1]=="") $modif_regle[$match[2]]=array('old_regle' => $value['old_regle_'.$match[2]], 'new_regle' => $value['new_regle_'.$match[2]]);
					}
				}

				if($regle_droit != false || $regle_gauche != false){
					$requete = "";
					foreach($modif_regle as $id_regle => $ashes){
						$modif = "";
						if($ashes['old_regle'] != $ashes['new_regle'] )	$modif .= sprintf(' `terme_gauche` = \'%1$s\', `long_terme_gauche` = LENGTH(\'%1$s\')' ,$ashes['new_regle']);
						if($regle_droit != false)						$modif .= sprintf('%1$s`terme_droit` = \'%2$s\', `long_terme_droit` = LENGTH(\'%2$s\')', $modif ==""?" ":",",$regle_droit);
						if(	$modif !=""){
							$requete = sprintf(' UPDATE `regle_reduction` SET %s WHERE `regle_reduction`.`id_regle_reduction` = %d;' ,$modif,$id_regle);
							$resultat = sql_executer($connexion, $requete);
							if(!$resultat) $error .= "erreur mise à jour regle".mysql_error()."<br/>";
						}
					}

				}
				else $error .= "Aucune modification detectée.";
			}
			if($error ==""){
				$button_submit 	= '';
				$button_cancel 	= '';
				if($regle_droit != false){
					$objResponse->assign('terme_droit', 'value', $regle_droit);
					$value['terme_droit'] = $regle_droit;
				}
				$objResponse->assign('terme_gauche', 'style.display', '');
				$objResponse->assign('terme_droit', 'style.display', '');
				$objResponse->call('xajax_gestionRegle',$value,'correspondance');
			}
			else{
				$objResponse->alert($error);
				$objResponse->call('xajax_gestionRegle',$value,$value['action_regle']);
			}
			break;
			/*
			 case "model" :
			 // ne sert a rien pour l'instant

			 $id_modele_rech = isset($value['id_modele_rech'])?$value['id_modele_rech']:'-1';
			 $id_marque_rech = $value['libelle_marque_select'];
			 if($id_marque_rech != '-1'){
			 $out_title = sprintf("Choix d'un modèle :\n");
			 $out_select_model = '';
			 	
			 $out_select_model .= sprintf("&nbsp;<select name=\"id_modele_rech\" class=\"menu03\"  onchange=\"\">\n");
			 if ($id_marque_rech != -1) {
				$out_select_model .= sprintf("<option value=\"-1\">Tous les modèles</option>\n");

				$requete  = " select distinct m.id_modele, m.libelle as libelle_modele, m.id_categorie, cat.code_sortie";
				$requete .= " from bdc_modele m, corpus c, bdc_categorie cat";
				$requete .= " where c.id_marque = $id_marque_rech";
				$requete .= "   and m.id_modele = c.id_modele";
				$requete .= "   and cat.id_categorie = c.id_categorie";
				$requete .= " order by m.libelle asc, m.id_categorie asc";
				$resultat = sql_executer($connexion, $requete);
				while ($ligne = sql_lire_ligne_objet($resultat)) {
				$modele_trouve = false;
				$out_select_model .= sprintf("<option value=\"%d\"%s>%s (%s)</option>\n", $ligne->id_modele, $ligne->id_modele == $id_modele_rech ? " selected" : "", $ligne->libelle_modele, $ligne->code_sortie);
				}
				}
				$out_select_model .= sprintf("</select>\n");
					
				$out = $out_title.$out_select_model;
				}
				$objResponse->assign('model', 'innerHTML', $out);

				break;
				*/
		default:
			break;

	}


	$objResponse->assign('legend_gestion_regle',	'innerHTML', $legend);
	$objResponse->assign('regle_error',				'innerHTML', $error);


	$objResponse->assign('terme_droit_select',		'innerHTML', $terme_droit_select);
	$objResponse->assign('terme_gauche_select',		'innerHTML', $terme_gauche_select);

	$objResponse->assign('correspondance_button',	'innerHTML', $button_correspondance);
	$objResponse->assign('view_terme_gauche',		'innerHTML', $view_terme_gauche);
	$objResponse->assign('view_terme_droit',		'innerHTML', $view_terme_droit);

	$objResponse->assign('ajouter_regle',			'innerHTML', $button_ajouter);
	$objResponse->assign('modifier_regle',			'innerHTML', $button_modifier);
	$objResponse->assign('submit_regle',			'innerHTML', $button_submit);
	$objResponse->assign('submit_regle_cancel',		'innerHTML', $button_cancel);

	if($alert!="")$script .= "xajax_alert('$alert');";//debug
	if($script != "") $objResponse->script($script);


	return $objResponse;
}


/*
 * parseIncludedFile :
 * parse le fichier en entr&eacute;e , genere un/des fichier(s) temporaire(s) contenant(s) la chaine entre les balises recherch&eacute;es
 * retourne un tableau
 * utilis&eacute; pour extraire la colonne droite, le compl&eacute;ment de head et les fonctions xajax optionnelles
 *
 */
function parseIncludedFile($fichier){
	$output['optionalColGauche'] 	= "";//contenu optionel de la colonne de gauche
	$output['optionalXajax'] 		= "";//fonctions xajax optionelles
	$output['optionalHead'] 		= "";//contenu optionel du head html
	$output['optionalHeader'] 		= "";//contenu optionel du header
	$output['idMenuRelatif'] 		= "";//contenu optionel du header
	$output['contenu'] 				= "";//contenu restant

	$t_lignes=file($fichier);//on stocke le fichier passés dans un tableau

	$optionalColGauche = false;
	$optionalHead =  false;
	$optionalXajax = false;
	$optionalHeader =  false;

	$write = false;

	foreach($t_lignes as $ligne){
		if(preg_match("/<\s*fin\s+colonne\s+gauche\s*>/",$ligne))	$write=false;
		if(preg_match("/<\s*fin\s+fonction\s+xajax\s*>/",$ligne))	$write=false;
		if(preg_match("/<\s*fin\s+head\s*>/",$ligne))				$write=false;
		if(preg_match("/<\s*fin\s+header\s*>/",$ligne))				$write=false;

		if($write != false){
			$ligne = str_replace("\/\*","/*",$ligne);
			$ligne = str_replace("\*\/","*/",$ligne);

			if(trim($ligne) != "" && !preg_match("/^\/\//",$ligne)){
				$output[$write].= $ligne;
			}
		}
		else{
			$output['contenu'].= $ligne;
		}
		if(preg_match("/^\/\*\s*<\s*id_menu_relatif\s*=\s*(.+?)\s*>\s*\*\/$/",$ligne,$match))$output['idMenuRelatif'] = $match[1];

		if(preg_match("/<\s*debut\s+colonne\s+gauche\s*>/",$ligne))	$write = "optionalColGauche";
		if(preg_match("/<\s*debut\s+fonction\s+xajax\s*>/",$ligne))	$write = "optionalXajax";
		if(preg_match("/<\s*debut\s+head\s*>/",$ligne))				$write = "optionalHead";
		if(preg_match("/<\s*debut\s+header\s*>/",$ligne))			$write = "optionalHeader";

	}

	global $racine_admin;
	global $open_folder;
	$open_folder = "$racine_admin/added/";//dossier dans lequel apache a les droit de lecture et d'&eacute;criture
	$rand_filename = "fileTempo".str_replace(array("/","\\"),array("",""),$fichier);//rand(0, time()).".php";//nom de fichier le plus unique possible;=>pas compatible avec ajax, car un fichier se cr&eacute;&eacute; a chaque appel de fonction ajax et ne s'efface pas
	$rand_time = rand(0, time());
	$file_tempo = array();

	if($output['contenu'] != "")			$file_tempo['contenu'] = $open_folder."contenu_".$rand_filename.".php";
	if($output['optionalColGauche'] != "")	$file_tempo['optionalColGauche'] = $open_folder."optionalColGauche_".$rand_filename.".php";
	if($output['optionalHeader'] != "")		$file_tempo['optionalHeader'] = $open_folder."optionalHeader".$rand_filename.".php";
	if($output['optionalXajax'] != ""){
		$file_tempo['optionalXajax'] = $open_folder."optionalXajax_".$rand_filename;
		//recherche dans la chaine de caractere de toutes les occurences de ligne commençant par function
		//extraction du nom de chaque fonction afin de pouvoir les d&eacute;clarer
		preg_match_all("/^\s*function\s*(\w+).*?\(.*?\)/mi",$output['optionalXajax'],$matches);
		foreach($matches[1] as $declare_xajax_function){
			$output['optionalXajax'] .= sprintf('$xajax->register(XAJAX_FUNCTION,"%s");%s',$declare_xajax_function,"\n");
		}
	}

	foreach($file_tempo as $key => $file){
		$file_tempo_ecrire=fopen($file,"w");
		if($file_tempo_ecrire){
			if($key != 'contenu') $output[$key] = sprintf("<?php \n %s \n ?>",$output[$key]);
			fwrite($file_tempo_ecrire,$output[$key]);
			fclose($file_tempo_ecrire);
			chmod($file, 0664);
			$output[$key] = $file;
		}
	}

	return $output;
}


/*
 * construit l'outil de pagination
 */
class pagination {
	private $byPage; // int, Nombre d'enregistrement a afficher par page
	private $rows; // int, Nombre total d'enregistrement
	private $dossierImage;

	public $goFirst;// string, Caractere ou chaine de caractere pour aller a la premiere page
	public $goPrevious;// string, Caractere ou chaine de caractere pour aller a la page precedente
	public $goLast;// string, Caractere ou chaine de caractere pour aller a la derniere page
	public $goNext;// string, Caractere ou chaine de caractere pour aller a la page suivante
	public $goFirstDisabled;
	public $goPreviousDisabled;
	public $goLastDisabled;
	public $goNextDisabled;

	public function __construct() {
		if(isset($_GET['p']) && is_numeric($_GET['p'])) {
			$this->currentPage = intval($_GET['p']);
		}elseif(isset($_POST['p']) && is_numeric($_POST['p'])){
			$this->currentPage = intval($_POST['p']);
		}else {
			$this->currentPage = '1';
		}
		$this->dossierImage = $_SESSION['dossier_image'];
		

		$this->goFirst 		= "<img src=\"". $this->dossierImage ."page-first.gif\"  alt='' />";
		$this->goPrevious 	= "<img src=\"". $this->dossierImage ."page-prev.gif\"  alt='' />";
		$this->goLast 		= "<img src=\"". $this->dossierImage ."page-last.gif\"  alt='' />";
		$this->goNext 		= "<img src=\"". $this->dossierImage ."page-next.gif\"  alt='' />";

		$this->goFirstDisabled 		= "<img src=\"". $this->dossierImage ."page-first-disabled.gif\"  alt='' />";
		$this->goPreviousDisabled 	= "<img src=\"". $this->dossierImage ."page-prev-disabled.gif\"  alt='' />";
		$this->goLastDisabled 		= "<img src=\"". $this->dossierImage ."page-last-disabled.gif\"  alt='' />";
		$this->goNextDisabled 		= "<img src=\"". $this->dossierImage ."page-next-disabled.gif\"  alt='' />";

	}

	public function __set($var, $value) {
		$this->$var = intval($value);
	}

	public function __get($var) {
		if(isset($this->$var)) {
			return $this->$var;
		}
	}
	/*
	 // Retourne le nombre de page
	 // return int
	 */
	private function pagesCount()
	{
		$pagesCount = ceil($this->rows / $this->byPage);
		return $pagesCount;
	}
	/*
	 // Calcule le point de depart de la LIMIT d'une requete sql
	 // en fonction de la page actuelle et du nombre d'enregistrement voulu
	 // return int
	 */
	public function fromPagination() {
		if(!isset($this->pagesCount)) {
			$this->pagesCount = $this->pagesCount();
		}
		if($this->currentPage > 0 && $this->rows > 0) {
			if($this->currentPage > 0 && $this->currentPage <= $this->pagesCount) {
				$from = ($this->currentPage - 1) * $this->byPage;
			}
			else {
				$from = $this->currentPage * $this->byPage;
			}
		}
		else {
			$from = '0';
		}
		return $from;
	}
	/*
	 // La pagination en elle meme
	 // @param int $pageBefore: Nombre de page que l'on veut afficher avant la page actuelle (defaut: 10)
	 // @param int $pageAfter: Nombre de page que l'on veut afficher apres la page actuelle  (defaut: 10)
	 //
	 // $array['page']: L'affichage de la page
	 // $array['current']: defini a 1 pour la page actuelle, 0 pour les autres
	 // $array['p']: Le numero de la page pour les lien
	 //
	 // return array
	 */
	public function pages($pageBefore = '0', $pageAfter = '1') {
		if(!isset($this->pagesCount)) {
			$this->pagesCount = $this->pagesCount();
		}
		if($this->pagesCount >= '1') {
			$pages = array();
			if($this->currentPage > $this->pagesCount) {
				$this->currentPage = $this->pagesCount;
			}
			if ($this->currentPage > 1) {
				$pages[] = array('page' => $this->goFirst,
                'current' => '0',
                'p' => '1'
                );
                $previous = $this->currentPage - 1;
                $pages[] = array('page' => $this->goPrevious,
                'current' => '0',
                'p' => $previous
                );
			}
			else{
				$pages[] = array('page' => $this->goFirstDisabled,
                'current' => '',
                'p' => ''
                );
                $pages[] = array('page' => $this->goPreviousDisabled,
                'current' => '',
                'p' => ''
                );
			}
			if($this->pagesCount <= '1') {
				$pages[] = array('page' => '1',
                'current' => '0',
                'p' => '1'
                );
			}
			else {
				for($i = $this->currentPage - $pageBefore,$j = $this->currentPage + $pageAfter; $i < $j; $i++) {
					if($i >= 1 && $i <= $this->pagesCount) {
						if($i == $this->currentPage) {
							$pages[] = array('page' => "[".$this->currentPage ."]",
                            'current' => '1',
                            'p' => $this->currentPage
							);
						}
						else {
							$pages[] = array('page' => $i,
                            'current' => '0',
                            'p' => $i
							);
						}
					}
				}
			}
			if ($this->currentPage < $this->pagesCount) {
				if ($this->currentPage != $this->pagesCount)
				{
					$next = $this->currentPage + 1;
					$pages[] = array('page' => $this->goNext,
                    'current' => '0',
                    'p' => $next
					);
				}
				$pages[] = array('page' => $this->goLast,
                'current' => '0',
                'p' => $this->pagesCount
				);
			}
			else{
				$pages[] = array('page' => $this->goNextDisabled,
                'current' => '',
                'p' => ''
                );
                $pages[] = array('page' => $this->goLastDisabled,
                'current' => '',
                'p' => ''
                );
			}
			return $pages;
		}
	}
}


/**
 * function pagination :
 *
 * eval() : retourne NULL  sauf si return est appelé dans le code évalué
 * eval() : retourne FALSE  dans le cas d'une erreur de syntaxe
 *
 * @param $requete string requete Mysql
 * @param $get array[optionnal] les variables get à integrer au formulaire et aux liens de l'outil de pagination
 * @param $conteneur_structure_de_sortie string[optionnal] code evalué, entete de la structure de retour, la premiere balise html rencontrée est refermée en fin de processus
 * @param $structure_de_sortie string[optionnal] code evalué dans la boucle while($ligne = sql_lire_ligne_objet($resultat)){...} , si vide, la structure par defaut est utilisée (tableau)
 * @return	string retourne les données mises en forme
 * @see class pagination
 */
function pagination($requete,$get=array(),$conteneur_structure_de_sortie='',$structure_de_sortie=''){
	$output = '';

	if($requete == '')return 'Error, la requete MySQL est vide';


	$connexion = sql_connecter();
	$requete_count = preg_replace("/^(.*?select)(.*?)(from.*)$/i","$1 count(*) as numRows $3",$requete);
	$resultat = sql_executer($connexion, $requete_count);
	if(!$resultat) return 'Error mysql : '. mysql_error();

	$ligne = sql_lire_ligne_objet($resultat);
	$numRows = $ligne->numRows;

	$taille_page_liste = "10,25,50,100";
	$taille_page = recuperer_variable("taille_page", 10);
	if (!(is_numeric($taille_page)))$taille_page = 10;
	if(!isset($_SESSION['taille_page']) || $_SESSION['taille_page'] != $taille_page) $_GET['p']= $_POST['p'] = 1;
	$_SESSION['taille_page'] = $taille_page;

	$pagination = new pagination();
	$pagination->dossierImage = $_SESSION['dossier_image'];
	$pagination->byPage = $taille_page;
	$pagination->rows = $numRows;

	$from = $pagination->fromPagination(); // sert pour les requetes sql : LIMIT $from, $pagination->byPage
	$pages = $pagination->pages();

	//affichage barre de pagination
	//if(isset($pages)) {
		
		$URI = '';//contenaire des variables get a passer via le formulaire de pagination

		//variables receptionnées via $_GET et repassées lors de la soumission du formulaire de pagination
		if(is_array($get))$_GET = array_merge($_GET, $get);//$get argument de la fonction
		//$_GET = array_unique(array_reverse($_GET));
		//var_dump($_GET);
		$pre_output = '';
		foreach($_GET as $cle => $val){
			if($cle == 'action' || $cle == 'id')$URI .= sprintf("%s%s=%s",$URI == ""?"?":"&amp;",$cle,$val);
			if($cle != 'p' && $cle != 'taille_page' ){//p est le num de la page courante, taille_page est deja un champs du formulaire
				if(is_array($val)){
					foreach($val as $vv)
						$pre_output .= sprintf("<input type=\"hidden\" name=\"%s[]\" value=\"%s\" />\n",$cle,$vv);
				}
				else
					$pre_output .= sprintf("<input type=\"hidden\" name=\"%s\" value=\"%s\" />\n",$cle,$val);
			}
		}

		$form_pagination  = sprintf("<div class=\"pagination_navigation\">\n");
		$form_pagination .= sprintf("<form id=\"choix_page_%d\" action=\"%s\"  method=\"post\" >\n", "1", $_SERVER['PHP_SELF'].$URI);
		$form_pagination .= sprintf("<div class=\"pagination_navigation_separateur\">\n");
		
		$form_pagination .= $pre_output;
		if($numRows > 0){
			foreach ($pages as $key){
				if($key['current'] == 1 || ($key['current'] === "0" && !preg_match("/img/",$key['page'])))  {//current page, 0 && ... si il n'y a qu'une seule page a afficher
					$form_pagination .= sprintf("Page <input class=\"num_page\" type=\"text\" id=\"p\" name=\"p\" value=\"%s\" /> sur %s\n", $key['p'], $pagination->pagesCount);
				}
				elseif($key['current'] == ''){//for disabled img
					$form_pagination .= sprintf("<button type=\"button\" style=\" cursor:hand;\" >%s</button>\n",$key['page']);
				}
				else {//items de navigation
					//$output .= sprintf("<a href=\"%s%s&amp;p=%s\" >%s</a>\n",$_SERVER['PHP_SELF'],$URI,$key['p'],$key['page']);
					$form_pagination .= sprintf("<button type=\"button\" style=\" cursor:hand;\" onclick=\"jQuery('.num_page').val('%s');jQuery('#loading').show();this.form.submit();\">%s</button>\n", $key['p'], $key['page']);//this.form.submit();
				}
			}
		
	
			$form_pagination .= sprintf("</div><!-- end class pagination_navigation_separateur -->\n");
	
			//nombre de lignes par pages
			$form_pagination .= sprintf("<div class=\"pagination_navigation_separateur\">\n");
			$form_pagination .= sprintf("Taille ");
			$form_pagination .= sprintf("<select name=\"taille_page\" onchange=\"jQuery('#loading').show();this.form.submit();\">\n");
			foreach(explode(",",$taille_page_liste) as $nombre_de_lignes){
				$form_pagination .= sprintf('<option value="%1$s"%2$s>%1$s</option>'."\n",$nombre_de_lignes, $taille_page == $nombre_de_lignes ? " selected=\"selected\" " : "");
			}
			$form_pagination .= sprintf("</select>\n");
			$form_pagination .= sprintf("</div><!-- end class pagination_navigation_separateur -->\n");
		}
		//nombre total d'enregistrements
		$form_pagination .= sprintf("<div class=\"pagination_navigation_separateur\">");
		$form_pagination .= sprintf("%s enregistrements\n", $pagination->rows);
		$form_pagination .= sprintf("</div><!-- end class pagination_navigation_separateur -->\n");
		$form_pagination .= sprintf("<div class=\"pagination_navigation_separateur\">&nbsp;</div><!-- end class pagination_navigation_separateur -->\n");

		$form_pagination .= sprintf("</form>\n");
		$form_pagination .= sprintf("</div><!-- end class pagination_navigation -->");
		
		$output = $form_pagination;
	/*}
	else{
		$num_random = rand(0,99);
		$output .= sprintf("<div class=\"pagination_navigation\">");
		$output .= sprintf("<form name=\"choix_page_%02d\" action=\"%s\"  method=\"get\" >", $num_random, $_SERVER['PHP_SELF']);
		$output .= sprintf("</form>");
		$output .= sprintf("</div>");
	}*/
	//fin affichage barre de pagination

	//traitement liste de résultats
	$requete .= sprintf(" limit %s, %s",$from, $pagination->byPage);
	$resultat = sql_executer($connexion, $requete);

	if(!$resultat) return 'Error mysql : '. mysql_error();
	//print($requete);
	$nbchamps=mysql_num_fields($resultat);

	if($structure_de_sortie == ""){
		//construction pour affichage par defaut
		for($champs=5;$champs>=1;$champs--){ //nombre de champs par ligne affichée
			$nb_ligne_affichage = 0;		//nombre de lignes par par reponse Mysql
			if(($nbchamps+1)%$champs == 0){
				$nb_ligne_affichage = ceil($nbchamps/$champs);
				break;
			}
			elseif($nbchamps%$champs == 0){
				$nb_ligne_affichage = $nbchamps/$champs;
				break;
			}
		}

		if($nb_ligne_affichage == 1){//on mettra les titre des champs en titre du tableau
			$field_name = array();
			for($i=0;$i<$nbchamps;$i++){
				$field_name[] = mysql_field_name($resultat, $i);
			}
		}
	}

	$output .= sprintf("<div class = \"output_pagination\">");//debug
	$compteur_de_lignes = 0;

	while ($ligne = sql_lire_ligne_objet($resultat)) {
		if($structure_de_sortie != ""){

			if($compteur_de_lignes == 0 && $conteneur_structure_de_sortie!=""){
				preg_match("/.*?<(\w+)/",str_replace('$','\$',addslashes($conteneur_structure_de_sortie)),$match_conteneur_structure_de_sortie);
				if(isset($match_conteneur_structure_de_sortie[1])){
					
					$rrr = eval($conteneur_structure_de_sortie);
					if($rrr ===false)echo "error eval \$conteneur_structure_de_sortie";
					$output .= $rrr;
				}
				else{
					$output .= "Impossible de trouver une balise html dans le conteneur structure de sortie";
					echo $match_conteneur_structure_de_sortie[0];
					//echo htmlentities(str_replace('$','\$',addslashes($conteneur_structure_de_sortie)));
				}
			}

			$compteur_de_lignes++;
			$rrr = eval($structure_de_sortie);
			if($rrr ===false)echo "error eval \$structure_de_sortie";
			$output .= $rrr;
			$output .= "\n";

			if($compteur_de_lignes == sql_nombre_lignes($resultat) && isset($match_conteneur_structure_de_sortie[1])){
				$output .= sprintf("</%s><!--end tag -->\n",$match_conteneur_structure_de_sortie[1]);
			}
		}
		else{
			//debut affichage par defaut
			if($compteur_de_lignes == 0){
				$output .= "<table style=\"border:1px solid black;\">\n";
				if(isset($field_name)){
					$output .= "<tr>";
					foreach($field_name as $title){
						$output .= sprintf("<th>%s</th>",$title);
					}
					$output .= "</tr>\n";
				}
			}

			$output .= sprintf("<tr id=\"tr_%d\">\n",$compteur_de_lignes++);
			$j =0;
			foreach($ligne as $key => $val){
				if(++$j>$champs){
					$output .="</tr>\n<tr>";
					$j =1;
				}
				$output .= sprintf("<td style=\"border:1px solid black;\">%s %s</td>",!isset($field_name)?$key." : ":"",$ligne->$key);
			}
			$output .= sprintf("</tr>\n");

			if($compteur_de_lignes == sql_nombre_lignes($resultat)){
				$output .= sprintf("</table>\n");
			}
			else{
				$output .= sprintf("<tr><td colspan=\"%d\" style=\"border:3px solid black;background:black;height=5px;\" ></td></tr>\n",$champs);
			}
			//fin affichage par defaut
		}
	}

	$output .= sprintf("</div><!--end output pagination -->");
	//fin traitement liste de résultats
	$form_pagination = str_replace(array("form id=\"choix_page_1\"","id=\"p\"") , array("form id=\"choix_page_2\"","id=\"p_2\""), $form_pagination);
	$output.= $form_pagination;
	
	return $output;
}//end function pagination

?>